흔히 아는 최신순, 좋아요순, 댓글순과 같이 동적으로 정렬기준이 바뀌는 상황에서는 동적 sorting을 해야된다.
offset, limit는 pageagle
에서 정보를 동적으로 값을 변경하여 사용할수 있다.
더불어 PageReqeust(상의 클래스는 Pageable)
정적메소드에 정렬기준(order by)
인자도 넣을 수 있다.
실제 사용할 쿼리문에 위에서 정의한 정렬 기준를 OrderSpecifier
객체를 사용해서 생성한 후 쿼리문에 넣게되면 동적정렬 이 가능해진다.
// 페이징, 정렬 기준 세팅하기
List<Sort.Order> orders = new ArrayList<>();
orders.add(Sort.Order.desc(searchForm.getOrderKey()));
Pageable pageable = PageRequest.of(0,3, Sort.by(orders)); //3개 씩
동적으로 정렬기준을 처리하기 위해 클라이언트에게 정렬기준이 되는 컬럼명을 받아온다.
여기서는 searchForm.getOrderKey()
에 "최근순", "댓글순", "좋아요순"에 해당하는 컬렴명이 담겨진다.
받아온 컬럼 기준의 오름차순, 내림차순을 설정하고 난뒤 Sort
객체로 생성하고 Pageable
를 생성할때 인자로 전달해준다.
위 코드에서 정렬기준을 List로 전달하였는데 현재 프로젝트에서는 정렬기준이 하나씩만 있으면 되므로 사실상 List로 사용하지 않아도된다. 하지만 List로 여러개의 정렬을 설정할수 있기 때문에 한번 해보았다.
첫번째 인자에는 Pageable
에 담아뒀던 Sort
정보가 들어가게 된다. 그리고 두번째 인자에는
정렬 되는 칼럼의 Path로 기준이 되는 칼럼과 그 칼럼이 속한 엔티티가 합쳐진 것입니다.
예를 들어 Post 엔티티에 postId로 정렬기준을 잡는다면 Post객체.postId가 되는 것입니다.
//동적 정렬
for(Sort.Order o : pageable.getSort()) {
PathBuilder pathBuilder = new PathBuilder(QPost.post.getType(), QPost.post.getMetadata());
query.orderBy(new OrderSpecifier(o.isAscending() ? Order.ASC: Order.DESC, pathBuilder.get(o.getProperty())));
}
Pagealbe
에 담아논 Sort
객체들을 하나씩 꺼내어 정렬기준 컬럼명과PathBuilder
를 통해 Path를 만들어 OrderSpecifier
객체의 인자로 전달해준다.
그렇게 되면 쉽게 볼수 있는 조회순, 최신순, 좋아요순 등과 같은 동적정렬을 구현할수 있다.