2011-05-25 885 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)); 
}