【问题标题】:JPA Query: join a subquery with grouping conditionJPA Query:加入具有分组条件的子查询
【发布时间】:2019-01-24 05:58:38
【问题描述】:

我有一个表示特定对象的更改事件的实体。比如:

@Entity
public class Event {
    @Id
    private String eventId;
    private String objectId;
    private Instant creationDate;
    // other fields, getters, setters
}

对于特定的objectId,可能有多个事件对象。

现在我需要查询每个objectId 的所有最新事件(那些最大creationDateobjectId 摸索的事件)。

如果是纯 SQL,我会编写以下查询:

SELECT event.*
FROM
  event event
  JOIN (
         SELECT
           e.object_id          object_id,
           MAX(e.creation_date) last_date
         FROM event e
         GROUP BY e.object_id
       ) latest_event
    ON latest_event.object_id = event.object_id
       AND event.creation_date = latest_event.last_date

但不幸的是,类似的连接在 JPA 查询中不起作用。

问题:如何在 JPA 查询中加入子查询?

在我的情况下,使用本机查询不是一个选项,因为我使用带有分页功能的 Spring Data JPA 存储库,这不适用于本机查询。

【问题讨论】:

    标签: java sql spring-data-jpa hql jpql


    【解决方案1】:
    @Query( 
        value = "SELECT e FROM Event e " + 
                "WHERE e.creationDate = " +
                "(SELECT max(e2.creationDate) FROM Event e2 " + 
                "WHERE e2.objectId = e.objectId)"
    )
    

    【讨论】:

    • 这行不通。您在子查询中忽略objectId ,这意味着您计算的最大日期与对象无关。
    • @OleksandrShpota 每一行都有一个由自己的 objectId 选择的最大日期
    • 对不起,我的错。不知何故,我认为子查询在查询的第三行结束。让我看看它是如何工作的。
    • 如果 2 个 objectIds 的最大创建日期相等,这将不起作用。
    • @Rohit 如果我们有两个 objectId 并且都有一个 Y creationDate' and Y is max creationDate`,那么选择?
    【解决方案2】:
    SELECT *
    FROM  Event
    NATURAL JOIN
        (SELECT object_id, MAX(creation_date) AS creation_date
        FROM Event
        GROUP BY object_id) groupedEvent
    

    如果两个相等的 max creation_date 在同一个 object_id 中

    SELECT ev.*
    FROM Event ev
    INNER JOIN 
          (SELECT max(id) AS id
           FROM Event e
           INNER JOIN 
                  (SELECT object_id, MAX(creation_date) AS last_date
                   FROM Event GROUP BY object_id
                  ) groupedEvent 
           ON e.object_id = groupedEvent.object_id
           AND e.creation_date = groupedEvent.last_date
           GROUP BY e.object_id) dist 
    ON ev.id = dist.id;
    

    ```

    【讨论】:

    • 为什么你的NATURAL JOIN 有一个ON 子句??
    • JPA 查询语言不支持 NATURAL JOIN。除此之外,您的查询与我已经尝试过的类似 - 它不起作用。
    • @onedaywhen 是我的错,NATURAL JOIN 不需要ON 条件
    • @Oleksandr Shpota 很抱歉无奈,其他的应该可以工作,你能提供更多关于不工作的描述
    • 我不记得确切的错误,但它只是没有编译查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 2018-01-23
    • 1970-01-01
    • 2015-05-26
    • 2013-03-12
    • 1970-01-01
    相关资源
    最近更新 更多