【问题标题】:Need help to write a query in JPQL, without subqueries需要帮助在 JPQL 中编写查询,无需子查询
【发布时间】:2021-01-14 05:53:36
【问题描述】:

我需要对单个数据库执行一个简单的查询,但是由于JPQL中缺少子查询(除了HAVING和EXITS子句),我不知道怎么写。

表格是这样的

id  |  eventType | occurenceDate   | comment | data | ...
-----------------------------------------------------------
1   |  event-A   | 2020-09-14      | ...
2   |  event-B   | 2020-09-09      | ...
3   |  event-A   | 2020-09-13      | ...
4   |  event-A   | 2020-09-10      | ...
5   |  event-B   | 2020-09-20      | ...
6   |  event-C   | 2020-09-11      | ...

我需要一个查询来获取在给定参考日期按类型发生的所有下一个事件。 例如,如果参考日期是“2020-09-12”,我希望查询返回 id=3 和 5 的实体

获取 eventType/occurenceDate 元组列表没问题(这是唯一的复合键)

SELECT t.type, min(t.occurenceDate) 
FROM table t
WHERE t.occurenceDate > :referenceDate
GROUP BY t.eventType 

但没有子查询,我不知道如何获取完整的实体。

有什么帮助吗? 谢谢

【问题讨论】:

    标签: spring database jpa jpql


    【解决方案1】:

    实际上,子查询是您通常在 JPQL 中处理此查询的方式:

    SELECT t1
    FROM table t1
    WHERE t.occurenceDate > :referenceDate AND
          t.occurrenceDate = (SELECT MIN(t2.occurrenceDate)
                              FROM table t2
                              WHERE t2.eventType = t1.eventType);
    

    在大多数数据库中,如果没有正式的子查询,确实无法获得完整的记录(SQL Server 可能是一个例外,但即便如此,您仍然必须使用本机的非 JPQL 查询)。

    【讨论】:

      【解决方案2】:

      好的。 只需稍微更改您建议的查询,它就可以工作了! 不知道可以(或认为)在子查询中注入 t1 记录。 (是的,我的数据库知识很少^^)

      SELECT t1
      FROM table t1
      WHERE t1.occurrenceDate = (
          SELECT MIN(t2.occurrenceDate)
          FROM table t2
          WHERE t2.eventType = t1.eventType 
          AND t2.occurenceDate > :referenceDate
      );
      
      

      非常感谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-05
        • 2011-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多