[Querydsl] 존재여부 확인하기 (exists)

by 스뎅(thDeng) on

Querydsl을 사용하면서 데이터가 있는지 체크(exists)하기가 어려웠다.

Before Fix

팀에서 처음에 사용하던 쿼리는 아래 코드처럼 개수를 확인했는데,

public boolean existsById(Long orderId) {
    return from(order)
        .where(order.id.eq(orderId))
        .select(order.id)
        .fetchCount() > 0;
}

실제로 실행되는 쿼리는 아래처럼 생겼다. count 때문에 전체 데이터를 조회해야 하니 문제가 많았다. 데이터가 많으면 많을수록 성능은..

select
    count(order0_.id) as col_0_0_
from
    order order0_
where
    and order0_.id=?

After Fix

아래처럼 fetchFirst()를 사용하도록 수정했다.

public boolean existsById(Long orderId) {
    return from(order)
        .where(order.id.eq(orderId))
        .select(order.id)
        .fetchFirst() != null;
}

그러면 실제로 실행되는 쿼리는 아래처럼 limit을 사용하도록 바뀐다.

select
    order0_.id as col_0_0_
from
    order order0_
where
    and order0_.id=? limit ?

Notes

아래처럼 Spring Data JPA의 메소드 쿼리 exists를 사용하면,

boolean existsById(Long orderId);

count 쿼리를 사용하게 된다.

select
    count(*) as col_0_0_
from
    order order0_
where
    and order0_.id=?
별도로 명시하지 않을 경우, 이 블로그의 포스트는 다음 라이선스에 따라 사용할 수 있습니다: Creative Commons License CC Attribution-NonCommercial-ShareAlike 4.0 International License