본문 바로가기

SPRING

[SPRING] QueryDSL 복잡한 정렬 custom order by 설정 OrderSpecifier CaseBuilder

문제상황

단순히 하나의 컬럼 값으로 내림차순 오름차순 정렬하는것이 아닌

해당 컬럼의 값에 따라 커스텀 정렬하고자 한다

 

프로젝트 스펙

Spring boot / JAVA 11 /  JPA  /  MySQL

 

해결방안

QueryDSL  OrderSpecifier  CaseBuilder 를 사용하자

 

예시 

Video라는 테이블의 category라는 컬럼이 존재한다

category 데이터를 단순히 문자열의 내림차순 오름차순으로 정렬하는 것이 아닌

 '두드러기 -> 백반증 -> 바이러스사마귀' 순 으로 정렬하고 싶을 떈

QueryDSL을 사용해서 custom order by를 설정하자

 

public List<Video> getVideoListOrderByCategory(){
  JPAQueryFactory jpaQueryFactory = new JPAQueryFactory(em);
  QVideo qVideo = QVideo.video;

  OrderSpecifier<Integer> categoryOrder = new CaseBuilder()
          .when(qVideo.category.eq(Category.두드러기)).then(1)
          .when(qVideo.category.eq(Category.백반증)).then(2)
          .when(qVideo.category.eq(Category.바이러스사마귀)).then(3)
          .otherwise(4)
          .asc();

  JPAQuery<Video> jpaQuery = jpaQueryFactory
          .select(qVideo)
          .from(qVideo)
          .orderBy(categoryOrder, qVideo.dateCreated.desc());

  List<Video> videoList = jpaQuery.fetch();
  return videoList;
}

 

 

getVideoListOrderByCategory 메소드의 return값 videoList는 두드러기, 백반증, 바이러스사마귀 순으로 정렬되어 나온다

 

참고로! 다른 컬럼의 custom order by를 추가로 사용하고 싶을 땐

 .orderBy(categoryOrder, qVideo.dateCreated.desc()  뒤에 OrderSpecifier 를 하나 더 만들어 연결하면 된다

 

 

 

 

끄읏 -!