반응형
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개만 조회되면서 에러가 안 뜨는 것을 확인할 수 있다.
반응형
'SQL' 카테고리의 다른 글
[PostgreSQL] insert시 seq 최댓값 + 1로 자동증가 입력 (MAX값 +1) (0) | 2022.07.13 |
---|---|
[PostgreSQL] ::bpchar, ::character varying 의미 (0) | 2022.06.29 |
[SQL] LIKE 검색, NULL 함수, GROUP BY - HAVING (간단한 설명) (0) | 2022.04.14 |
[SQL] JOIN 개념 및 종류, VIEW(뷰), SELECT INTO, INSERT INTO SELECT, CASE ... WHEN ... END (0) | 2022.04.11 |
[SQL] SQL, CRUD 기초 (간단한 설명) (0) | 2022.04.07 |