페이징 처리

@Test
public void searchPageTest(){
    Team teamA = new Team("teamA");
    Team teamB = new Team("teamB");
    em.persist(teamA);
    em.persist(teamB);

    Member member1 = new Member("member1", 10, teamA);
    Member member2 = new Member("member2", 20, teamA);

    Member member3 = new Member("member3", 30, teamB);
    Member member4 = new Member("member4", 40, teamB);
    em.persist(member1);
    em.persist(member2);
    em.persist(member3);
    em.persist(member4);

    MemberSearchCondition memberSearchCondition = new MemberSearchCondition();

    PageRequest pageRequest = PageRequest.of(0, 3);
    Page<MemberTeamDto> memberTeamDtos = memberRepository.searchPageComplex(memberSearchCondition, pageRequest);
    List<MemberTeamDto> list = memberTeamDtos.get().toList();
    assertThat(list).extracting("username")
            .containsExactly("member1","member2","member3");

}
@Override
public Page<MemberTeamDto> searchPageComplex(MemberSearchCondition condition, Pageable pageable) {
    List<MemberTeamDto> content = queryFactory
            .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();
//  Long total
    JPAQuery<Long> countQuery = queryFactory
            //count(member.id) 형식으로 쿼리문 나가진다.
            .select(member.count())
            .from(member)
            .leftJoin(member.team, team)
            .where(usernameEq(condition.getUsername()),
                    teamNameEq(condition.getTeamName()),
                    ageGoe(condition.getAgeGoe()),
                    ageLoe(condition.getAgeLoe()))
            .fetchOne();
        return PageableExecutionUtils.getPage(content, pageable, countQuery::fetchOne);
//      return new PageImpl<>(content, pageable, total);

}

 

Tip) PageableExecutionUtils를 통해 Page객체를 얻을 때 total값이 필요할 때만 count 쿼리를 날릴 수 있다. count 쿼리를 안 날려도 되는 상황은 아래와 같다.

  • 페이지 시작이면서 컨텐츠 사이즈가 페이지 사이즈보다 작을 때
  • 마지막 페이지면서 컨텐츠 사이즈가 페이지 사이즈보다 작을 때

 

 

'Spring Boot > QueryDSL' 카테고리의 다른 글

null 처리( where절 동적 쿼리 )  (0) 2024.09.08
QueryDSL4RepositorySupport  (0) 2024.08.31
실무 활용 - 순수 JPA와 QueryDSL  (0) 2024.08.29
Spring Boot QueryDSL 중급 문법  (0) 2024.08.24
Spring Boot QueryDSL 기본 문법  (0) 2024.08.13

+ Recent posts