ホーム>source

特定のオブジェクトの変更イベントを表すエンティティがあります。何かのようなもの:

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

特定の objectId に複数のイベントオブジェクトがある場合があります 。

objectId のすべての最新イベントを照会する必要があります  (最大 creationDate を持つもの   objectId による手探り )。

純粋な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リポジトリを使用しているためです。

あなたの答え
  • 解決した方法 # 1

    @Query( 
        value = "SELECT e FROM Event e " + 
                "WHERE e.creationDate = " +
                "(SELECT max(e2.creationDate) FROM Event e2 " + 
                "WHERE e2.objectId = e.objectId)"
    )
    
    

  • 解決した方法 # 2

    SELECT *
    FROM  Event
    NATURAL JOIN
        (SELECT object_id, MAX(creation_date) AS creation_date
        FROM Event
        GROUP BY object_id) groupedEvent
    
    

    2つの等しい最大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;
    
    

    `` `

関連記事

  • 前へ java - JPAクエリ:サブクエリをグループ化条件に結合する