Bunu yapmanın en kolay yolunun sözde projeksiyon kullanmak olduğunu düşünüyorum. Sorgu sonuçlarını arayüzlerle eşleştirebilir. Kullanmak SqlResultSetMapping
sakıncalıdır ve kodunuzu çirkinleştirir :).
Yay verisi JPA kaynak kodundan bir örnek:
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();
}
}
Projeksiyonların bir listesini almak için bu yöntemi de kullanabilirsiniz.
Öngörüler hakkında daha fazla bilgi için bu bahar verileri JPA belgeleri girişine bakın.
Not 1:
Varlığınızın User
normal olarak tanımlanmasını unutmayın - öngörülen arayüzdeki alanlar bu varlıktaki alanlarla eşleşmelidir. Aksi takdirde alan eşlemesi bozulabilir ( getFirstname()
soyadı vb. Değerini döndürebilir).
Not 2:
Eğer kullanırsanız SELECT table.column ...
gösterim daima varlıktan eşleşen adları takma adları tanımlar. Örneğin, bu kod düzgün çalışmaz (projeksiyon her alıcı için boş değerler döndürür):
@Query(value = "SELECT user.firstname, user.lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
Ama bu gayet iyi çalışıyor:
@Query(value = "SELECT user.firstname AS firstname, user.lastname AS lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
Daha karmaşık sorgular söz konusu olduğunda, JdbcTemplate
bunun yerine özel depo kullanmayı tercih ederim .