querydsl 서브쿼리 페이징

greenTea·2023년 6월 16일
0

코드

😭현재 리뷰를 가져오는 쿼리를 작성중입니다.
queryDsl을 사용해서 가져오고 있는 상황인데 제가 원한 것은 offset부터 정해진 개수만큼만 페이징 처리해서 가져오는 것입니다.

아래는 이것을 구현한 쿼리입니다.

jpaQueryFactory.select(Projections.constructor(ReviewDto.class,
                        member.username,
                        review.title,
                        review.content,
                        review.image,
                        review.rate,
                        review.createDate
                ))
                .from(review)
                .leftJoin(review.member, member)
                .where(review.id.in(JPAExpressions.select(review.id)
                                .from(review)
                                .where(product.id.eq(productId))
                                .orderBy(review.id.desc())
                                .offset(offset)
                                .limit(REVIEW_MAX_COUNT)))
                .orderBy(review.id.desc())
                .fetch();

문제 발생

🧐위 코드를 돌려보면 페이징 처리가 나가지 않는 것을 확인 할 수 있습니다.

select
        m1_0.username,
        r1_0.title,
        r1_0.content,
        r1_0.image,
        r1_0.rate,
        r1_0.create_date 
    from
        review r1_0 
    left join
        member m1_0 
            on m1_0.id=r1_0.member_id 
    where
        r1_0.id in(select
            r2_0.id 
        from
            review r2_0 
        where
            r2_0.product_id=4 
        order by
            r2_0.id desc) 
    order by
        r1_0.id desc

해결

🥳chatGpt에 물어본 결과 queryDsl은 서브쿼리에서 페이징을 지원을 안한다고 합니다. 만약 페이징 처리가 필요하다면 바깥 쿼리로 빼야 합니다.

select
        m1_0.username,
        r1_0.title,
        r1_0.content,
        r1_0.image,
        r1_0.rate,
        r1_0.create_date 
    from
        review r1_0 
    left join
        member m1_0 
            on m1_0.id=r1_0.member_id 
    where
        r1_0.id in(select
            r2_0.id 
        from
            review r2_0 
        where
            r2_0.product_id=4 
        order by
            r2_0.id desc) offset 11 rows fetch first 10 rows only

🫡서브쿼리에 있던 페이징 처리를 바깥으로 이동한 결과 페이징이 다시 작동을 하는 것을 확인 할 수 있었습니다.

profile
greenTea입니다.

0개의 댓글