介绍

我有一个奇怪的任务-在Hibernate Criteria API(即数据库独立风格)上编写类似于

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/%'


我不知道如何交换类似运算符的操作数。

问题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的数据库添加它)。

结论

有人可以提议对我的黑客(与数据库无关的SQL)进行改进或对原始CriteriaAPI进行更正吗?

更新28.09.12

concat功能appears in Postgres 9.1

最佳答案

您可以编写自己的Criterion实现,该实现将生成与您的问题类似的SQL子句,不同的是它将使用与条件查询关联的方言来获取适当的concat函数,并将串联委托给此依赖于数据库的对象concat函数。

07-24 09:37
查看更多