조회 api를 만들던 도중 여러 테이블에 산재되어 있는 데이터를 가져와야 했다. 따라서 join이 여러 군데서 사용되므로 @Query
를 사용해서 nativeQuery=true
로 해주고 쿼리문을 직접 짜서 value에 넣어주었다.
물론, 파라미터는 ?1
?2
와 같이 물음표 뒤에 숫자를 붙여서 어떤 파라미터가 들어갈 지 명시하였다.
쿼리를 다 짜고 해당 API로 요청을 보냈는데 제대로 된 응답이 오지 않고, intelliJ 터미널에 org.hibernate.QueryException: JPA-style positional param was not an integral ordinal
이라는 에러가 발생하였다.
의외로 문제는 간단하게 해결되었다. 내가 작성했던 대략적인 쿼리문은 밑과 같았다.
SELECT 조회할 데이터들
FROM 여러 조인 테이블들
WHERE 조건 = ?1 AND 조건2 = ?2 AND 조건3 =?3;
이 오류는 물음표 뒤의 값이 숫자가 아니어서 발생하는 오류이다. @Query는 인자를 받을 때 ParameterParser
를 이용하는데,
195번째 줄에 NumberFormatException
에서 발생한 오류인 것을 알 수 있다. 즉, Integer.parseInt
함수가 제대로 들어가지 않았는데, 그 이유는 쿼리문의 끝을 알리는 세미콜론이 숫자 바로 뒤에 붙어있었기 때문이다. 즉, 3;
을 숫자로 변환하지 못하기 때문에 생긴 에러였다.
SELECT 조회할 데이터들
FROM 여러 조인 테이블들
WHERE 조건 = ?1 AND 조건2 = ?2 AND 조건3 =?3;
따라서 위의 쿼리문에서 조건3 = ?3;
이라는 구절에서 3과 ;
사이에 공백을 주었더니 잘 빌드되었다.
SELECT 조회할 데이터들
FROM 여러 조인 테이블들
WHERE 조건 = ?1 AND 조건2 = ?2 AND 조건3 =?3 ;
위와 같이 스페이스를 주어야 한다.