gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 15:08:36 24 4
gpt4 key购买 nike

简介

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com