내가 필요해서 내가 적는 블로그

JAVA 백엔드 개발자의 기록들

SPRING

result returns more than one elements; nested exception is javax.persistence.NonUniqueResultException

돌프 2022. 1. 13. 17:49
반응형

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 를 올려놓으신분이 있었다. 

 

* ref : https://github.com/CUBRID/hibernate-core/blob/master/hibernate-entitymanager/src/main/java/org/hibernate/jpa/internal/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를 찾아보는 좋은 시간이었던 것 같다.  끝.

 

 

 

 

본문 내용이 도움이 되셨다면, 아래의 공감버튼을 눌러주세요. 

정보 공유를 위한 포스팅에 큰 힘이 됩니다. 

만약 틀린 정보가 있으면 댓글 달아주세요. 수정하도록 하겠습니다. 

읽어주셔서 감사합니다. 오늘도 좋은 하루 보내세요. 

반응형