From 8b0d096060a864b1af5fc13c1e2a58c10cd2d8c1 Mon Sep 17 00:00:00 2001 From: "WIN10-01\\UserK" Date: Mon, 13 Dec 2021 23:57:01 +0900 Subject: [PATCH] =?UTF-8?q?docs=20:=20JPA=20`@Query(nativeQuery=20=3D=20tr?= =?UTF-8?q?ue)`=20=EC=82=AC=EC=9A=A9=EC=8B=9C=20=EC=A3=BC=EC=9D=98?= =?UTF-8?q?=ED=95=A0=20=EC=A0=90.md=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...uery(nativeQuery = true) 사용시 주의할 점.md | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 기록/JPA/2021-12-10 - JPA @Query(nativeQuery = true) 사용시 주의할 점.md diff --git a/기록/JPA/2021-12-10 - JPA @Query(nativeQuery = true) 사용시 주의할 점.md b/기록/JPA/2021-12-10 - JPA @Query(nativeQuery = true) 사용시 주의할 점.md new file mode 100644 index 0000000..3390f61 --- /dev/null +++ b/기록/JPA/2021-12-10 - JPA @Query(nativeQuery = true) 사용시 주의할 점.md @@ -0,0 +1,31 @@ +# JPA @Query(nativeQuery = true) 사용시 주의할 점 + +## 문제 상황 + +평화롭게(?) 개발을 진행하던 도중, 조금 복잡한 쿼리를 작성해야 할 일이 생겼다(querydsl로도 엄두가 안났다). 그래서 JPA Repository의 @Query(nativeQuery = true)를 사용해서 +해당 기능을 구현했다. 구현을 마치고 테스트를 시도했는데, 아래와 같은 에러를 마주쳤다. + +![](https://images.velog.io/images/banjjoknim/post/50bae7b1-ef63-4ef9-b7ae-37a319218c3d/image.png) + +![](https://images.velog.io/images/banjjoknim/post/5a28ece2-e260-49df-9cda-4ceeef4827a2/image.png) + +대충 읽어보면, `JPA-style positional param was not an integral ordinal` 이 원인이라고 한다. + +## 해결 + +해당 예외 메시지로 검색을 해보면 `org.hibernate.engine.query.spi.ParameterParser` 를 찾을 수 있다. + +![](https://images.velog.io/images/banjjoknim/post/98fad969-cae0-4926-a09b-dbbaf200bbdd/image.png) + +195번 라인을 살펴보면, 동일한 예외가 보이고 있는데, 쿼리상에 `?` 라는 문자열을 기준으로 파싱을 해주고 있다(?1, ?2 와 같이 파라미터를 입력할 경우). + +그런데 자세히 살펴보면 `NumberFormatException`이 발생했을 경우 해당 예외를 `catch` 해서 `QueryException`을 던지고 있다. 즉, `?1`, `?2` 와 같이 입력되는 파라미터를 +쿼리에 집어넣을 경우, `?` 뒤의 숫자를 `Integer.parseInt()`로 파싱하는 것이다. 여기에 실패하면 앞서 언급했던 예외가 발생하게 되는 것이다. + +![](https://images.velog.io/images/banjjoknim/post/def097cd-db91-4f3e-b813-73908d98516a/image.png) + +본인의 경우에는 마지막 파라미터인 offset 부분의 `?5;` 가 문제를 일으키는 원인이었고, `세미콜론(;)`을 제거하자 정상적으로 동작했다(띄어쓰기도 가능하다). + +## 결론 + +JPA의 Repository에서 @Query(nativeQuery = true) 를 사용할 경우, 쿼리 상에서 파라미터를 입력하는 부분에는 특히 신경써서 작성하도록 하자(~~띄어쓰기를 잘하자~~). \ No newline at end of file