문제상황
단순히 하나의 컬럼 값으로 내림차순 오름차순 정렬하는것이 아닌
해당 컬럼의 값에 따라 커스텀 정렬하고자 한다
프로젝트 스펙
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 를 하나 더 만들어 연결하면 된다
끄읏 -!
'SPRING' 카테고리의 다른 글
[JPA] @CreatedDate @LastModifiedDate 오류 해결 (0) | 2024.01.13 |
---|---|
SPRING으로 AES CBC, KISA_SEED_CBC 를 활용한 암호화 (1) | 2024.01.10 |
[SPRING] RequestMapping URL pathVariable에 null 값 허용하는 방법 (0) | 2023.11.22 |
[SPRING] postman 으로 API 호출 시 401 Unauthorized 오류 해결 (0) | 2023.08.01 |
[SPRING] Spring boot 초기 프로젝트 생성 및 세팅 (0) | 2023.06.19 |