我有一个在 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),但不确定如何表达所有这些部分。
此时使用视图不是一个选项,因为我们使用 MySQL 作为生产数据库,而集成测试则使用 H2 内存数据库运行。我无法在 H2 中找到 sata 减去函数,而 MySQL 确实支持此功能。
选择字段并不重要,因为它们仅用于测试目的。
- 您可以使用
Restrictions.disjunction()
对于或-和Restrictions.conjuction()
for 和 子句。
- 要引用实体的某个属性(如 pv.value),您可以使用
Projections.property("value")
- 对于铸造我不确定,也许使用
@Formula
您的实体上的注释?但这是一个 hibernate,而不是 JPA 注释。
- 据我所知,没有等效的
INTERVAL
在休眠中,但在这种情况下(也许也适用于上面的演员)你可以使用Restrictions.sqlRestriction("some sql...")
将所有这些放在一起以将您的查询转换为休眠条件将是一个挑战。
greetz,
Stijn
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)