inblog logo
|
silver
    프로젝트

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

    silver's avatar
    silver
    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

    RSS·Powered by Inblog