SQL

[SQL] Expected one result (or null) to be returned by selectOne(), but found: 2 해결 방법

15호의 개발자 2022. 6. 22. 15:13
반응형

 

 

Java에서 MyBatis를 이용해 SQL를 날릴 때 다음과 같은 에러 메시지가 떴다.

 

 


Expected one result (or null) to be returned by selectOne(), but found: 2

 

 

에러 메시지는 참 정직하다.

위 에러 메시지가 무슨 의미인지 해석할 필요도 없이 영어를 한국어로 번역할 수만 있으면 해석 가능하다.

 

 

결과값이 1개 또는 null이 나와야 하는데, 실제 실행 결과 2개가 나왔다는 뜻이다.

 

 

 

[해결 방법]

이런 경우에는 조회 쿼리를 날렸을 때 실제 조회되는 데이터를 확인해봐야 한다.

select 쿼리를 날렸다면 조회된 데이터가 콘솔에 뜰 것이다.

이를 직접 확인해보고 데이터가 몇 개가 나왔는지 확인해보자.

 

우선, 나는 페이징 처리를 하기 위해 데이터의 총 count값을 int로 받는 sql을 날렸었다.

조회된 데이터의 반환값은 int이므로 1개가 나와야하는데, 나의 경우는 1만 건 가까이 나왔다.

(위 에러 메시지에서는 편의상 2개가 나왔다고 적었다. 그 개수는 개인별 천차만별일 것이므로 중요하지 않다.)

 

확인해보니 int를 반환해야할 쿼리에 GROUP BY를 쓰고 있어서 이런 결과가 나온 것이었다.

화면에 뿌리는 용도로 날리던 실제 데이터 조회용 쿼리를 복사-붙여넣기 해서 반환값만 SELECT COUNT(1)로 바꾼다는 게, GROUP BY를 지우는 걸 깜박해서 이런 실수가 났던 것이다.

GROUP BY를 지우고 다시 쿼리를 날려보니 int 값 1개만 조회되면서 에러가 안 뜨는 것을 확인할 수 있다.

 

 

 

반응형