페이징 처리
@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 |