[JPA] JPA-style positional param was not an integral ordinal 에러 해결

smlee·2022년 8월 26일
1

에러 일지

목록 보기
15/24
post-thumbnail

❓ 문제 상황

조회 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 ;

위와 같이 스페이스를 주어야 한다.


📚 Reference

0개의 댓글