我有一个在 SQL 中运行的相当复杂的查询,但为了可移植性,我想在 HQL 中表达它。我将获取用户配置的首选项值(如果存在),否则我必须使用默认值。该值必须从当前日期中减去,并与我感兴趣的表中的列相匹配:
select d.id, d.guid, d.deletetimestamp, u.id
from descriptor d, ownerkey ow, user u
where
d.parentid in
(select td.id
from descriptor td, store s
where s.type = 'Trash'
and s.descriptorid = td.id
)
and d.ownerkeyid = ow.id
and ow.ownerid = u.id
and
(
(d.deletetimestamp < CURRENT_TIMESTAMP() - INTERVAL
(select pv.value
from preferencevalue pv, userpreference up
where u.id = up.userid
and up.preferenceid = 26
and up.value = pv.id)
DAY)
or
(d.deletetimestamp < CURRENT_TIMESTAMP() - INTERVAL
(select cast(pv.value as SIGNED)
from preferencevalue pv, defaultpreference dp
where dp.preferenceid = 26
and not exists(select up.userid from userpreference up where u.id = up.userid and up.preferenceid = 26)
and dp.value = pv.id)
DAY)
)
我正在尝试使用 Criteria API 构建它,它似乎包含我需要的大部分逻辑运算符(等于、大于或 isEmpty/isNull),但不确定我将如何表达所有这些部分.
此时使用 View 不是一个选项,因为我们使用 MySQL 作为生产数据库,而集成测试使用内存数据库中的 H2 运行。我无法在 H2 中找到 sata substract 函数,而 MySQL 支持此功能。
选择字段并不重要,因为它们仅用于测试目的。
最佳答案
- 您可以对 or 使用
Restrictions.disjunction()
,对 and 从句使用Restrictions.conjunction()
。 - 要引用实体的某个属性(如 pv.value),您可以使用
Projections.property("value")
- 对于转换我不确定,也许在您的实体上使用
@Formula
注释?但这是 hibernate 而不是 JPA 注释。 - 据我所知,hibernate 中没有
INTERVAL
的等效项,但在这种情况下(可能也适用于上述转换),您可以使用Restrictions.sqlRestriction("some sql.. .")
将所有这些放在一起以将您的查询转换为 hibernate 条件将是一个挑战。
欢迎,
静
关于java - 如何使用 OR 和汇总函数构建高级 Hibernate Query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4440576/