介绍
我有一个奇怪的任务 - 在 Hibernate Criteria API(即数据库独立风格)上编写类似于
select * from branch b where '2/5/3/' like b.hier_path + '%'
连接运算符在哪里+
。连接运算符是 MS SQL 中依赖于数据库的“+”,“||” 在甲骨文等
我必须使用 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 的建议吗?
更新 28.09.12
concat
函数出现在 Postgres 9.1