Saya pikir cara termudah untuk melakukannya adalah dengan menggunakan apa yang disebut proyeksi. Itu dapat memetakan hasil kueri ke antarmuka. Menggunakan SqlResultSetMapping
tidak 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 User
menetapkan 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 JdbcTemplate
repositori kustom sebagai gantinya.