그렇게하는 가장 쉬운 방법은 소위 프로젝션을 사용하는 것입니다. 쿼리 결과를 인터페이스에 매핑 할 수 있습니다. 사용 SqlResultSetMapping
은 불편하고 코드를 추악하게 만듭니다 :).
스프링 데이터 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 :
당신의 것으로 기억 User
실체가 정상으로 정의 - 투영 된 인터페이스의 필드는이 엔티티의 필드와 일치해야합니다. 그렇지 않으면 필드 매핑이 손상 될 수 있습니다 ( getFirstname()
성 등의 값을 반환 할 수 있음 ).
노트 2:
SELECT table.column ...
표기법 을 사용하는 경우 항상 엔티티의 이름과 일치하는 별칭을 정의하십시오. 예를 들어이 코드는 제대로 작동하지 않습니다 (프로젝션은 각 getter에 대해 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
대신 사용자 지정 저장소와 함께 사용하고 싶습니다 .