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 + 컨텐츠사이즈를 더해서 전체사이즈 구한다.) 카운트쿼리를 생략할 수 잇을때 생략할 수 있게 해준다.

 

출처 : 실전! Querydsl - 인프런 | 학습 페이지 (inflearn.com)