JPA @Query(nativeQuery = true) 사용시 주의할 점

콜트·2021년 12월 10일
0

문제 상황

평화롭게(?) 개발을 진행하던 도중, 조금 복잡한 쿼리를 작성해야 할 일이 생겼다(querydsl로도 엄두가 안났다). 그래서 JPA Repository의 @Query(nativeQuery = true)를 사용해서 해당 기능을 구현했다. 구현을 마치고 테스트를 시도했는데, 아래와 같은 에러를 마주쳤다.

대충 읽어보면, JPA-style positional param was not an integral ordinal 이 원인이라고 한다.

해결

해당 예외 메시지로 검색을 해보면 org.hibernate.engine.query.spi.ParameterParser 를 찾을 수 있다.

195번 라인을 살펴보면, 동일한 예외가 보이고 있는데, 쿼리상에 ? 라는 문자열을 기준으로 파싱을 해주고 있다(?1, ?2 와 같이 파라미터를 입력할 경우).

그런데 자세히 살펴보면 NumberFormatException이 발생했을 경우 해당 예외를 catch 해서 QueryException을 던지고 있다. 즉, ?1, ?2 와 같이 입력되는 파라미터를 쿼리에 집어넣을 경우, ? 뒤의 숫자를 Integer.parseInt()로 파싱하는 것이다. 여기에 실패하면
앞서 언급했던 예외가 발생하게 되는 것이다.

본인의 경우에는 마지막 파라미터인 offset 부분의 ?5; 가 문제를 일으키는 원인이었고, 세미콜론(;)을 제거하자 정상적으로 동작했다(띄어쓰기도 가능하다).

결론

JPA의 Repository에서 @Query(nativeQuery = true) 를 사용할 경우, 쿼리 상에서 파라미터를 입력하는 부분에는 특히 신경써서 작성하도록 하자(띄어쓰기를 잘하자).

profile
개발 블로그이지만 꼭 개발 이야기만 쓰라는 법은 없으니, 그냥 쓰고 싶은 내용이면 뭐든 쓰려고 합니다. 코드는 깃허브에다 작성할 수도 있으니까요.

0개의 댓글