Spring
[Spring] querydsl - paging
퉁그리
2022. 1. 3. 22:45
querydsl 5.0.0버전부터는 fetchResults()와 fetchCount()메소드가 deprecated됬기 때문에 다른방법이 필요하다.
Pageable 인터페이스와 PageImpl을 이용하면 비교적 쉽게 페이징할 수 있다.
@Override
public Page<MemberTeamDto> searchPageSimple(MemberSearchCondition condition, Pageable pageable) {
List<MemberTeamDto> content = jpaQueryFactory
.select(new QMemberTeamDto(
member.id,
member.username,
member.age,
team.id,
team.name))
.from(member)
.leftJoin(member.team, team)
.where(usernameEq(condition.getUsername()),
teamNameEq(condition.getTeamName()),
ageGoe(condition.getAgeGoe()),
ageLoe(condition.getAgeLoe()))
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
JPAQuery<Member> countQuery = jpaQueryFactory
.select(member)
.from(member)
.leftJoin(member.team, team)
.where(usernameEq(condition.getUsername()),
teamNameEq(condition.getTeamName()),
ageGoe(condition.getAgeGoe()),
ageLoe(condition.getAgeLoe()));
return PageableExecutionUtils.getPage(content, pageable, () -> countQuery.fetch().size());
}
PageableExecutionUtils.getPage을 쓰면 장점이 있다.
첫페이지면서 전체 페이지의 사이즈가 콘텐츠의 사이즈가 크거나
마지막 페이지일 때 (offset + 컨텐츠사이즈를 더해서 전체사이즈 구한다.) 카운트쿼리를 생략할 수 잇을때 생략할 수 있게 해준다.