JPA 쿼리시 제목과 같은 에러가 발생하였다.
NonUniqueResultException 그냥 영어만 봐도 뭔가 유니크 하지 않기 때문에 에러가 났다고 직감할 수 있다.
에러메세지 아래에 좀 더 찾아보니 친절하게 어디서 발생했는지까지 메세지가 나왔다.
Caused by: javax.persistence.NonUniqueResultException: result returns more than one elements
at org.hibernate.jpa.internal.QueryImpl.getSingleResult(QueryImpl.java:539)
일단 먼저, local .m2 repository에 있는 jar를 풀어서 디컴파일 해보았는데 찾기가 쉽지 않았다.
(디컴파일해도 잘 나오지 않았다)
그래서 구글에 에러가 나오는 위치를 찾아보니 (at org.hibernate.jpa.internal.QueryImpl.getSingleResult)
친절하게도 github에 QueryImpl.java 를 올려놓으신분이 있었다.
Muck를 찾아보니 쓰레기란 뜻이다 ;;; ㄷㄷ
아무튼! OOME를 피하기 위해 최대 쿼리 결과를 2개로만 셋팅하고 체크를 한다.
쿼리 결과에 대한 result.size를 기준으로
0이면 NoResultException
1이상이면 NonUniqueResultException 이 발생하는걸 볼 수 있다.
따라서 제목 처럼 필자가 발생한 상황은 NonUnizueResultException 이었다. 결과값이 1개 이상인 것이다.
그래서 DB에 다음과 같은 쿼리로 검색 해 보니 에러메세지 처럼 2개 이상의 행이 발견되어서
관련없는 1개의 행을 삭제 처리 하고 잘 해결되었다.
* MySQL 중복 데이터 확인 예제 (동일 name 데이터를 찾는 쿼리)
SELECT id, name, COUNT(*) as cnt
FROM people
GROUP BY name
HAVING COUNT(name) > 1;
사실 NonUniqueResultException을 보고 바로 DB에서 찾아서 해결하긴 했지만,
hibernate class를 찾아보는 좋은 시간이었던 것 같다. 끝.
본문 내용이 도움이 되셨다면, 아래의 공감버튼을 눌러주세요.
정보 공유를 위한 포스팅에 큰 힘이 됩니다.
만약 틀린 정보가 있으면 댓글 달아주세요. 수정하도록 하겠습니다.
읽어주셔서 감사합니다. 오늘도 좋은 하루 보내세요.