1. ホーム
  2. spring

[解決済み] Spring Data JPAでネイティブクエリ結果をNon-Entity POJOにマップする。

2022-07-16 02:50:11

質問

Spring Dataのリポジトリメソッドにネイティブクエリを実装しています。

@Query(value = "SELECT g.*, gm.* FROM group g LEFT JOIN group_members gm ON g.group_id = gm.group_id and gm.user_id = :userId WHERE g.group_id = :groupId", nativeQuery = true)
GroupDetails getGroupDetails(@Param("userId") Integer userId, @Param("groupId") Integer groupId);

で、その結果をNon-Entity POJOにマッピングしたいと思います。 GroupDetails .

それは可能ですか?もし可能なら、例を提示してくださいませんか?

どのように解決するのですか?

oridの答えのようにGroupDetailsと仮定すると、JPA 2.1を試してみました。 コンストラクタの結果 ?

@SqlResultSetMapping(
    name="groupDetailsMapping",
    classes={
        @ConstructorResult(
            targetClass=GroupDetails.class,
            columns={
                @ColumnResult(name="GROUP_ID"),
                @ColumnResult(name="USER_ID")
            }
        )
    }
)

@NamedNativeQuery(name="getGroupDetails", query="SELECT g.*, gm.* FROM group g LEFT JOIN group_members gm ON g.group_id = gm.group_id and gm.user_id = :userId WHERE g.group_id = :groupId", resultSetMapping="groupDetailsMapping")

で、リポジトリのインターフェイスには以下を使用します。

GroupDetails getGroupDetails(@Param("userId") Integer userId, @Param("groupId") Integer groupId);

Spring Data JPAによると ドキュメント によると、springはまずメソッド名にマッチする名前のクエリを探そうとします。 @NamedNativeQuery , @SqlResultSetMapping@ConstructorResult であれば、その挙動を実現できるはずです。