[프로젝트] JPQL Count 쿼리 타입 캐스팅 오류

silver's avatar
Dec 06, 2024
[프로젝트] JPQL Count 쿼리 타입 캐스팅 오류

🔍 문제 상황

아이디 중복 체크 시 ClassCastException 발생
notion image

원인 분석

JPQL의 COUNT() 함수는 항상 Long 타입을 반환
// JPQL COUNT 반환 타입 count(entity) → Long (항상) // 잘못된 캐스팅 (int) q.getSingleResult() // Long → int 직접 캐스팅 불가

✅ 해결 방법

notion image
notion image
 
notion image
public int checkId(String username) { Query q = em.createQuery("select count(u) from User u where u.username = :username"); q.setParameter("username", username); // 결과를 Long으로 받고 int로 변환 Long count = (Long) q.getSingleResult(); return count.intValue(); // Long을 int로 변환 }

더 나은 구현 방법

  1. TypedQuery 사용으로 타입 안정성 확보
public int checkId(String username) { TypedQuery<Long> query = em.createQuery( "select count(u) from User u where u.username = :username", Long.class // 반환 타입 명시 ); query.setParameter("username", username); Long count = query.getSingleResult(); return count.intValue(); }
  1. 존재 여부만 확인하는 경우→Boolean 반환
public boolean existsByUsername(String username) { TypedQuery<Long> query = em.createQuery( "select count(u) from User u where u.username = :username", Long.class ); query.setParameter("username", username); return query.getSingleResult() > 0; } public interface UserRepository extends JpaRepository<User, Long> { boolean existsByUsername(String username); }
 

🎯 타입 변환 비교

방법
코드
문제점
❌ 직접 캐스팅
(int) q.getSingleResult()
ClassCastException 발생
⚠️ 2단계 캐스팅
((Long) q.getSingleResult()).intValue()
가능하지만 권장하지 않음
✅ TypedQuery
TypedQuery<Long> query
타입 안정성 보장

Share article

silver