JPA에서 데이터를 조회 할 때는 보통 find로 시작하는 Query Method를 사용하여 조회합니다.
하지만 복잡한 관계에 있는 테이블들을 사용해 조회해야 할 경우에는 직접 쿼리를 작성하여 조회하는데요, 이럴 때 사용하는 Annotation이 @Query (org.springframework.data.jpa.repository.Query) 입니다.
@Query 사용법
@Query(value = "query 작성", nativeQuery = true)
@Query Parameter 전달 방법
@Query(value = "select userId, userNm from user where user_id = :userId", nativeQuery = true)
Optional<User> findUser(@Param("userId") String userId);
query로 파라메터를 전달하기 위해서는 @Param (org.springframework.data.repository.query.Param) 을 사용하고,
query 내에서는 ':변수명' 을 사용합니다.
@Query 사용 시 발생 오류
ERROR: relation "table_name" does not exist
테이블은 분명 존재하는데 위와 같은 오류가 발생할 수 있습니다.
테이블명에 대문자가 있는 경우와 스키마를 작성하지 않은 경우인데요,
예를들어 테이블명에 대문자가 들어간 경우 Postgresql 에서는 기본적으로 소문자로 인식하기 때문에 "M_OP_USER" 와 같이 쌍따옴표로 테이블명을 감싸 주어야 합니다.
@Query(value = "select userId, userNm from \"M_OP_USER\" where user_id = :userId", nativeQuery = true)
Optional<User> findUser(@Param("userId") String userId);
테이블의 스키마도 빼먹지 않도록 합니다.
@Query(value = "select userId, userNm from 스키마.\"M_OP_USER\" where user_id = :userId", nativeQuery = true)
Optional<User> findUser(@Param("userId") String userId);
ConverterNotFoundException
No converter found capable of converting from type [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] to type [DTO]]
Postgresql에서 위와같은 Exception 이 발생할 경우 DTO로 매핑이 안된다면,
DTO class 대신 Interface를 생성하여 받도록 합니다.
@Query(value = "select userId, userNm from 스키마.\"M_OP_USER\" where user_id = :userId", nativeQuery = true)
Optional<UserInterface> findUser(@Param("userId") String userId);
public interface UserInterface {
String getUserId();
String getUserNm();
}
'Programing > JPA' 카테고리의 다른 글
JPA 에서 entity를 삭제하는 여러가지 방법과 차이 (0) | 2023.05.04 |
---|---|
JPA Query Methods 정리 (0) | 2023.04.13 |
JPA Sequence 자동증가 설정 @SequenceGenerator (0) | 2023.03.07 |
JPA MapStruct Date format 설정 timestamp, date, string (0) | 2023.02.07 |
JPA MapStruct, ModelMapper 설정 방법, 차이 Entity to DTO, DTO to Entity (0) | 2023.02.03 |
댓글