java - Hibernate CriteriaAPI 和类似运算符。交换操作数+独立于数据库的串联-可能吗?

标签 java sql hibernate hibernate-criteria

简介

我有一个奇怪的任务 - 在 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/

相关文章:

java - Apache Commons 等于/哈希码生成器

Java 正则表达式 : replacing a specific kind of url in a string?

sql - 显式调用触发器

java - 如何获取一个文档的_id MongoDB Java

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql - 两次使用同一张表时获取结果

java - 无法从结果集中读取列值;字符串索引超出范围 : 0

hibernate - HQL在Hibernate中实时转成SQL吗?

java - 如何自动检查/确保所有外部库是否包含在 eclipse 中的 lib 文件夹中?

java - 查找哪个依赖项包含 Spring WebApplicationInitializer