我的带下划线的数据库是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函数。请为此提出一些解决方案。
答案 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));
}