JPA @Query 사용 시 주의점 ERROR: relation "table_name" does not exist, ConverterNotFoundException
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();
}