JPA fetch Join + Specification 사용시 페이징 이슈

Created:

SpecificationFetch Join(@EntityGraph) 를 같이 사용할때 특정 케이스에서 totalElements값이 다르게 나온 현상

totalElements값이 잘못 나오는 케이스

totalElements값을 구해오기 위해 jpa 내부적으로 count쿼리를 만들어서 날린다.

이때 주엔티티와 연관엔티티가 OneToMany로 연결되있고 조건절에 연관엔티티 관련 조건 (예를들어 연관엔티티를 가지고 있는 주엔티티만 가져오는 조건)이 존재할 경우 totalElements값이 11이 나와야 정상인데 19가 나오는등 주엔티티가 가진 연관엔티티 복수개가 함께 더해져서 잘못된 totalElements가 반환된다.

아래 쿼리는 jpa 내부에서 만들어준 count쿼리 인데 실행시켜보면 주엔티티(pagination)가 10개밖에 없는데도 연관엔티티(sub_pagination) 가 여러개 있다보니 totalElements가 11개 이상으로 반환되었다.

select
    count(pagination0_.id) as col_0_0_
from
    pagination pagination0_
    inner join sub_pagination subpaginat1_ on pagination0_.id = subpaginat1_.pagination_id
where
    subpaginat1_.id is not null

totalElements값이 제대로 나오게 수정

distinct (query.distinct(true);)를 추가시켜주니 아래처럼 count 가져오는 쿼리를 만들어주어 totalElements값이 정상적으로 나왔다.

select
    distinct count(distinct pagination0_.id) as col_0_0_
from
    pagination pagination0_
    inner join sub_pagination subpaginat1_ on pagination0_.id = subpaginat1_.pagination_id
where
    subpaginat1_.id is not null

대신 당연하게도 count 쿼리뿐 아니라 원래의 메인 쿼리도 distinct가 붙게 되므로 데이터가 의도한대로 반환되는지 한번더 확인해야할것같다.

Tags:

Categories:

Updated:

Comments