Saya pikir cara termudah untuk melakukannya adalah dengan menggunakan apa yang disebut proyeksi. Itu dapat memetakan hasil kueri ke antarmuka. Menggunakan SqlResultSetMappingtidak nyaman dan membuat kode Anda jelek :).
Contoh langsung dari kode sumber JPA data musim semi:
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();
}
}
Anda juga dapat menggunakan metode ini untuk mendapatkan daftar proyeksi.
Lihat entri dokumen JPA data musim semi ini untuk info selengkapnya tentang proyeksi.
Catatan 1:
Ingatlah untuk Usermenetapkan entitas Anda seperti biasa - bidang dari antarmuka yang diproyeksikan harus cocok dengan bidang di entitas ini. Jika pemetaan lapangan mungkin rusak ( getFirstname()mungkin mengembalikan nilai nama belakang dan sebagainya).
Catatan 2:
Jika Anda menggunakan SELECT table.column ...notasi, selalu tentukan alias yang cocok dengan nama dari entitas. Misalnya kode ini tidak akan berfungsi dengan baik (proyeksi akan mengembalikan null untuk setiap pengambil):
@Query(value = "SELECT user.firstname, user.lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
Tapi ini berfungsi dengan baik:
@Query(value = "SELECT user.firstname AS firstname, user.lastname AS lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
Dalam kasus kueri yang lebih kompleks, saya lebih suka menggunakan JdbcTemplaterepositori kustom sebagai gantinya.