Programing/JPA

JPA @Query 사용 시 주의점 ERROR: relation "table_name" does not exist, ConverterNotFoundException

리커니 2023. 4. 8. 16:04
반응형

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();
}

 

반응형