Spring Data JPAはネイティブクエリ結果を非エンティティPOJOにマップします 質問する

Spring Data JPAはネイティブクエリ結果を非エンティティPOJOにマップします 質問する

ネイティブクエリを備えた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

可能ですか、例を挙げていただけますか?

ベストアンサー1

最も簡単な方法は、いわゆるプロジェクションを使用することだと思います。これにより、クエリ結果をインターフェイスにマップできます。 を使用するとSqlResultSetMapping不便で、コードが醜くなります :)。

Spring Data JPA ソースコードからの例:

public interface UserRepository extends JpaRepository<User, Integer> {

   @Query(value = "SELECT firstname, lastname FROM SD_User WHERE id = ?1", nativeQuery = true)
   NameOnly findByNativeQuery(Integer id);

   public static interface NameOnly {

     String getFirstname();

     String getLastname();

  }
}

このメソッドを使用して、投影のリストを取得することもできます。

投影の詳細については、この Spring Data JPA ドキュメントのエントリを参照してください。

注1:

エンティティを通常どおりに定義することを忘れないでくださいUser。投影されたインターフェイスのフィールドは、このエンティティのフィールドと一致する必要があります。そうでない場合、フィールド マッピングが壊れる可能性があります (getFirstname()姓などの値が返される可能性があります)。

注2:

表記を使用する場合は、SELECT table.column ...常にエンティティの名前と一致するエイリアスを定義します。たとえば、次のコードは正しく動作しません (投影は各ゲッターに対して null を返します)。

@Query(value = "SELECT user.firstname, user.lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);

しかし、これは問題なく動作します:

@Query(value = "SELECT user.firstname AS firstname, user.lastname AS lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);

より複雑なクエリの場合は、JdbcTemplate代わりにカスタム リポジトリを使用することをお勧めします。

おすすめ記事