代码之家  ›  专栏  ›  技术社区  ›  Sasha Shpota A-Bag

JPA查询:使用分组条件联接子查询

  •  0
  • Sasha Shpota A-Bag  · 技术社区  · 7 年前

    我有一个表示特定对象的更改事件的实体。类似于:

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

    objectId .

    现在 我需要查询每个 (那些有max的 creationDate 摸索 ) .

    如果是纯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存储库,这对本机查询不起作用。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Morteza Jalambadani Robert Beltran    7 年前
    @Query( 
        value = "SELECT e FROM Event e " + 
                "WHERE e.creationDate = " +
                "(SELECT max(e2.creationDate) FROM Event e2 " + 
                "WHERE e2.objectId = e.objectId)"
    )
    
        2
  •  0
  •   onedaywhen    7 年前
    SELECT *
    FROM  Event
    NATURAL JOIN
        (SELECT object_id, MAX(creation_date) AS creation_date
        FROM Event
        GROUP BY object_id) groupedEvent
    

    如果两个相等的最大创建日期在同一个对象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;
    

    ```