728x90
Querydsl의. orderBy() 메서드를 살펴보면
OrderSpecifier 매개변수로 받는다.
아주 간편하게 정렬을 하는 방법을 기록해 본다.
private OrderSpecifier pageableToOrderSpecifier(Pageable pageable) {
Sort.Order sortOrder = pageable.getSort().get().collect(Collectors.toList()).get(0);
Order order = sortOrder.getDirection().isAscending() ? Order.ASC : Order.DESC;
PathBuilder<Object> sort = new PathBuilder<>(WorldCup.class, "worldCup").get(sortOrder.getProperty());
return new OrderSpecifier(order, sort);
}
이런 식으로 정렬을 하기 위해 Pageable 객체의 Order정보와 Sort 정보를 꺼내어 OrderSpecifier객체를 생성해 리턴하면 된다.
.orderBy(pageableToOrderSpecifier(pageable)) // 대략적으로 이런느낌
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
여기서 재밌는 점은
PathBuilder<Object> sort = new PathBuilder<>(WorldCup.class, "worldCup").get(sortOrder.getProperty());
해당 부분이다.
이 부분은 내가 넘겨준 String 값을 읽어 WorldCup 엔티티와 매칭시켜 자동으로 정렬 기준을 만들어준다.
PageRequest.of(page - 1, size, direction, sort);
sort 값으로 "id" 라고 주면, WorldCup 엔티티의 id 값을 기준으로 direction에 따라 오름차순 혹은 내림차순으로 정렬해 준다.
더욱 좋은 점은 연관관계 매핑이 맺어져 있는 테이블들의 값들도 간편하게 사용할 수 있다.
예를 들어 "member.nickname" 이라고 주게 되면,
WorldCup 엔티티와 연관관계 매핑을 맺은 Member 엔티티의 nickname 필드를 기준으로 정렬해 준다.
더 재밌는 점은 간단한 연산도 가능하다.
승률을 기준으로 정렬을 하고 싶으면, "winCount/matchCount" 라고 주면 해당 값을 기준으로 정렬해 준다.
장점
- 간단하게 정렬기준 구현 가능
- 다양한 정렬기준을 유연하게 받을 수 있음
단점
- 내가 원치 않는 값으로도 정렬을 할 수 있어 이를 막기 위해서는 추가적인 작업을 해주어야 함
- 연관관계 매핑이 되어있지 않는 값은 참조할 수 없음
개발 초기에 간편하게 구현해 놓고 임시로 사용하기에는 아주 좋아 보인다.
728x90
'개발일지 > 돌픽' 카테고리의 다른 글
Google Custom Search API 사용해보기 (0) | 2023.04.30 |
---|---|
테스트 시 SpringSecurity 비활성화 하기 (0) | 2023.04.28 |
MySql 랜덤 정렬 (0) | 2023.04.25 |
도메인 별로 enum 관리 (0) | 2023.04.19 |
이상형월드컵 프로젝트 (0) | 2023.04.18 |