java - 如何使用 OR 和汇总函数构建高级 Hibernate Query

标签 java mysql hibernate orm criteria

我有一个在 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 支持此功能。

选择字段并不重要,因为它们仅用于测试目的。

最佳答案

  1. 您可以对 or 使用 Restrictions.disjunction(),对 and 从句使用 Restrictions.conjunction()
  2. 要引用实体的某个属性(如 pv.value),您可以使用 Projections.property("value")
  3. 对于转换我不确定,也许在您的实体上使用 @Formula 注释?但这是 hibernate 而不是 JPA 注释。
  4. 据我所知,hibernate 中没有 INTERVAL 的等效项,但在这种情况下(可能也适用于上述转换),您可以使用 Restrictions.sqlRestriction("some sql.. .")

将所有这些放在一起以将您的查询转换为 hibernate 条件将是一个挑战。

欢迎,

关于java - 如何使用 OR 和汇总函数构建高级 Hibernate Query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4440576/

相关文章:

php - laravel 查询生成器中的 SUBSTR 返回错误

php - 如何使用 Fullcalendar.io 每年重复生日日期?

php - 使用 PHP 将日期添加到 MySQL

java - 我可以使用 Hibernate 连接不同的数据库并从表中导入数据吗?没有预定义的对象类

java - 处理 NumberFormatException 的最佳实践

java - Hadoop 文档

java - Lauch4j .ini文件指定jre路径

java - Cassandra 读取/获取性能

java - Hibernate中的ObjectNotFoundException : No row with the given identifier exists

java - hibernate 系统异常 : could not deserialize