2011-05-25 202 views
1

我加下劃線的數據庫是MS SQL服務器。我通過java hibernate使用HQL查詢。 如果我在concat中使用replace函數,它會錯誤地解釋查詢。 例如:HQL concat函數

HQL Query : from Project where replace('\\\\yyy\\\\','\\\\','\\\\\\\\') like concat(replace(projectPathPrefix,'\\\\','\\\\\\\\\\\\\\\\')),'%') and sourceControlSystems=3 

SQL interpretation : select * from PRJ_project project where (replace('\\ooo\\', '\\', '\\\\') like replace(project0_.project_path_prefix+'\\'+'\\\\\\\\')+'%' and source_control_system_id=3 

它還轉換逗號作爲外括號包含concat函數替換功能到+,。如果不需要的數據庫是MySQL或Oracle,這兩者都使用concat函數,這可以正常工作。但是,由於SQL服務器使用「+」運算符進行連接,HQL以非常荒謬的方式用+代替連接函數。請爲此提出一些解決方案。

+0

難道你有你的HQL查詢太多右括號?我認爲'concat(替換(projectPathPrefix,'\\','\\\\\\\')),'%')'應該是concat(replace(projectPathPrefix,'\\','\\\ '','%')' – 2011-05-25 10:10:44

+0

是的,已經過修正並嘗試過。但仍然是同樣的問題。它錯誤地解釋。有沒有其他的選擇連接,然後concate()在休眠,它與MS SQL服務器,甲骨文以及MySQL一起工作? – 2011-05-25 11:28:30

回答

0

我想你已經遇到了錯誤http://opensource.atlassian.com/projects/hibernate/browse/HHH-4963。由於該bug報告指出,你可以通過定義和使用自定義的方言(通過繼承SQLServer2008Dialect),並註冊替換功能解決此錯誤:

@Override 
protected void registerFunctions() { 
    super.registerFunction(); 
    registerFunction("replace", new StandardSQLFunction("replace", StandardBasicTypes.STRING)); 
}