そのための最も簡単な方法は、いわゆるプロジェクションを使用することだと思います。クエリ結果をインターフェイスにマップできます。使用するの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();
}
}
このメソッドを使用して、予測のリストを取得することもできます。
予測の詳細については、この春のデータJPAドキュメントエントリを確認してください。
注1:注1:
User
エンティティを通常として定義することを忘れないでください。投影されたインターフェイスのフィールドは、このエンティティのフィールドと一致する必要があります。そうしないと、フィールドマッピングが破損する可能性があります(getFirstname()
姓などの値を返す可能性があります)。
注2:注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
代わりにカスタムリポジトリを使用したいと思います。