微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

需要帮助以JPQL编写无子查询的查询

如何解决需要帮助以JPQL编写无子查询的查询

我需要在单个数据库上执行一个简单的查询,但是由于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 

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

有什么帮助吗? 谢谢

解决方法

实际上,子查询是您通常在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查询)。

,

好。 只需稍微更改您建议的查询,它就可以工作了! 不知道有可能(或认为)在子查询中插入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
);

非常感谢您

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。