콘텐츠로 건너뛰기

JPA에서 count()는 Long Type을 return 함

통계에서 사용하는 쿼리를 만들다보니, (약간은) 부득이 하게 JPA Query Method를 사용하지 않고 @Query annotation을 이용해서 아래처럼 구현하였다.

호출하는 쪽의 로직은 아래와 같다.

자세한 로직은 회사 업무상 대외비이기 때문에 약간 이상한 네이밍인 점은 신경쓰지 않기로 하자.

어쨌거나 위의 로직을 돌리면 오류가 발생한다.

for (int count : counts) 에서 ClassCastException이 발생한다.

심지어   List<Integer> counts 는 정상적으로 받아왔는데, for문에서 오류가 나는 것이 좀 당황스러웠다.

그래서 JPA 스펙을 찾아보니 아래처럼 기술되어 있다.

JSR338 (Java Persistence API v2.1)에 따르면 Count() 를 이용한 쿼리의 return value는 Long으로 정의되어 있다. 그리고 Count에 대한 결과가 존재하지 않을 경우에는 0을 반환하도록 되어 있다. ( sum() 의 경우는 null이 return된다)

결국 이 모든 것은 지정된 type(여기서는 Integer)으로 return 해주는 mybatis에 익숙했던 것이 오류였다.

다만, 위에 적은 것처럼  List<Integer> counts 로 return 값을 assign 할 때 오류가 나는 것이 아니라, 해당 값을 사용하려 할 때 오류가 나는 점은 여전히 설계에 문제가 있지 않나 생각해본다.

추가로 위 counts를 getClass() 해보면  class java.lang.Long 으로 표시된다. 분명 generic은 Integer인데도 말이다.

“JPA에서 count()는 Long Type을 return 함”의 2개의 댓글

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다