Tôi nghĩ cách dễ nhất để làm điều đó là sử dụng cái gọi là phép chiếu. Nó có thể ánh xạ kết quả truy vấn tới các giao diện. Sử dụng SqlResultSetMapping
là bất tiện và làm cho mã của bạn trở nên xấu xí :).
Một ví dụ ngay từ mã nguồn JPA dữ liệu mùa xuân:
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();
}
}
Bạn cũng có thể sử dụng phương pháp này để lấy danh sách các phép chiếu.
Kiểm tra mục nhập tài liệu JPA dữ liệu mùa xuân này để biết thêm thông tin về các phép chiếu.
Lưu ý 1:
Hãy nhớ User
xác định thực thể của bạn là bình thường - các trường từ giao diện được chiếu phải khớp với các trường trong thực thể này. Nếu không, ánh xạ trường có thể bị hỏng ( getFirstname()
có thể trả về giá trị của họ và vân vân).
Lưu ý 2:
Nếu bạn sử dụng SELECT table.column ...
ký hiệu, hãy luôn xác định bí danh khớp với tên từ thực thể. Ví dụ: mã này sẽ không hoạt động bình thường (phép chiếu sẽ trả về giá trị null cho mỗi getter):
@Query(value = "SELECT user.firstname, user.lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
Nhưng điều này hoạt động tốt:
@Query(value = "SELECT user.firstname AS firstname, user.lastname AS lastname FROM SD_User user WHERE id = ?1", nativeQuery = true)
NameOnly findByNativeQuery(Integer id);
Trong trường hợp các truy vấn phức tạp hơn, JdbcTemplate
thay vào đó tôi muốn sử dụng với kho lưu trữ tùy chỉnh.