🔍 문제 상황
아이디 중복 체크 시 ClassCastException 발생

원인 분석
JPQL의 COUNT() 함수는 항상 Long 타입을 반환
// JPQL COUNT 반환 타입
count(entity) → Long (항상)
// 잘못된 캐스팅
(int) q.getSingleResult() // Long → int 직접 캐스팅 불가✅ 해결 방법



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로 변환
}더 나은 구현 방법
- 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();
}- 존재 여부만 확인하는 경우→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