searchMemberV1(MemberSearchCondition condition) {
return memberJpaRepository.search(condition);
}
@GetMapping("/v2/members")
public Page 스프링 데이터 JPA의 sort를 querydsl에서 깔끔하게 쓸 수 있도록 제공하는 인터페이스가 있다. 그런데 join의 경우 안된다. 복잡해 지면 파라미터를 받아서 그때그때 order by 조건을 만들어야 한다. <aside>
💡 그냥 처음부터 파라미터로 받아서 쓰는게 어떨까.. </aside> 영한님 의견 Sort는 조건이 조금만 복잡해져도 스프링 데이터 Sort를 Querydsl의 OrderSpecifier로 변환하는 코드@RestController
@RequiredArgsConstructor
public class MemberController {
private final MemberJpaRepository memberJpaRepository;
private final MemberRepository memberRepository;
@GetMapping("/v1/members")
public List<MemberTeamDto> searchMemberV1(MemberSearchCondition condition) {
return memberJpaRepository.search(condition);
}
@GetMapping("/v2/members")
public Page<MemberTeamDto> searchMemberV2(MemberSearchCondition condition, Pageable pageable) {
return memberRepository.searchPageSimple(condition, pageable);
}
@GetMapping("/v3/members")
public Page<MemberTeamDto> searchMemberV3(MemberSearchCondition condition, Pageable pageable) {
return memberRepository.searchPageComplex(condition, pageable);
}
}
스프링 데이터 정렬
Pageable
의 Sort
기능을 사용하기 어렵다. 루트 엔티티 범위를 넘어가는 (join 되는) 동적 정렬이 필요하면 스프링 데이터 페이징이 제공하는 Sort를 사용하기 보다는 파라미터를 직접 받아서 처리하는 것을 권장한다.JPAQuery<Member> query = queryFactory
.selectFrom(member);
for (Sort.Order o : pageable.getSort()) {
PathBuilder pathBuilder = new PathBuilder(member.getType(),
member.getMetadata());
query.orderBy(new OrderSpecifier(o.isAscending() ? Order.ASC : Order.DESC,
pathBuilder.get(o.getProperty()))); List<Member> result = query.fetch();