ネイティブクエリを備えた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
代わりにカスタム リポジトリを使用することをお勧めします。