HQL concat函数

时间:2011-05-25 09:54:51

标签: sql-server hibernate

我的带下划线的数据库是MS SQL服务器。我通过java hibernate使用HQL查询。 如果我在concat中使用replace函数,它会错误地解释查询。 例如:

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

它还将replace函数的逗号,转换为+,因为外括号包含concat函数。如果不受欢迎的数据库是MySQL或Oracle,这可以正常工作,因为它们都使用concat函数。但是,当SQL服务器使用“+”运算符进行连接时,HQL以非常荒谬的方式用+替换concat函数。请为此提出一些解决方案。

1 个答案:

答案 0 :(得分:0)

我认为你已经遇到了错误http://opensource.atlassian.com/projects/hibernate/browse/HHH-4963。正如错误报告所示,您可以通过定义和使用自定义方言(通过继承SQLServer2008Dialect)并注册替换函数来解决此错误:

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