개발일지/돌픽

Querydsl .orderBy()

E-room 2023. 4. 27. 18:08
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