😭현재 리뷰를 가져오는 쿼리를 작성중입니다.
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
🫡서브쿼리에 있던 페이징 처리를 바깥으로 이동한 결과 페이징이 다시 작동을 하는 것을 확인 할 수 있었습니다.