简介
我有一个奇怪的任务 - 在 Hibernate Criteria API(即以数据库独立的风格)上编写类似于的 SQL 查询
select * from branch b where '2/5/3/' like b.hier_path + '%'
其中+
是连接运算符。连接运算符是 MS SQL 中依赖于数据库的“+”、“||”在Oracle等中。
我必须使用 Criteria API(并且无法切换到 HQL)。
问题#1 - 类似运算符
不幸的是,Hibernate 只允许编写基于 Java 对象属性的 Criteria:
pCriteria.createCriteria(Branch.class).add(Restrictions.like("hierarchyPath", "2/5/3/%"));
这相当于
select * from branch where 'hier_path like 2/5/3/%'
我不知道如何交换 like 运算符的操作数。
问题 #2 - 与数据库无关的串联
SQL 代码必须适用于 Oracle、MS SQL Server、DB2、Postgres、Sybase、MySQL、HSQLDB、Firebird(以及其他一些新的关系数据库)。
我现在得到的是基于 SQL 的 hack:
Restrictions.sqlRestriction("? like concat({alias}.hier_path,'%')", "2/5/3/", Hibernate.STRING)
不幸的是,concat
是依赖于数据库的函数,出现在大多数上述数据库中(Postgres 和 Firebird 除外)。该方法是一种解决方法,不能用作恒定的解决方案(我将尝试将自定义函数 concat
添加到没有它的数据库中)。
结论
有人可以对我的 hack(独立于数据库的 SQL)提出改进建议或者对原始 CriteriaAPI 进行更正吗?
更新 2012 年 9 月 28 日
concat
函数 appears in Postgres 9.1
最佳答案
您可以编写自己的 Criterion 实现,它会生成一个与您问题中的 SQL 子句类似的 SQL 子句,只不过它会使用与条件查询关联的方言来获取适当的 concat 函数并将串联委托(delegate)给此函数依赖于数据库的 concat 函数。
关于java - Hibernate CriteriaAPI 和类似运算符。交换操作数+独立于数据库的串联-可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12625726/