• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

order by 의 동적 정렬에 대한 질문입니다.

22.06.10 17:48 작성 조회수 852

0

동적 정렬을 하고 싶은데요.
원하는 결과는
1. 한글 (오름차순, 내림차순) 영어 숫자 내림차순 오름차순
2. 영어 (오름차순, 내림차순 ) 한글 숫자 내림차순 오름차순
 
입니다.
 
JPAQuery<User> content = query.selectFrom(user)
.where(
searchQueryCustom(keyword, search),
getIn(userIdListFilterByLanguage)
).orderBy(getSorting(pageable), getDirectionByName(pageable));


private OrderSpecifier<Integer> getSorting(Pageable pageable) {
for (Sort.Order order : pageable.getSort()) {
Order direction = order.getDirection().isAscending() ? Order.ASC : Order.DESC;

switch (order.getProperty()) {
case "email":
return new OrderSpecifier(direction, user.email);
case "sortKorean":
return new OrderSpecifier(direction, new CaseBuilder()
.when(user.name.between("", "")).then(1)
.when(user.name.between("a", "Z")).then(2)
.otherwise(3));
case "sortEnglish":
return new OrderSpecifier(direction, new CaseBuilder()
.when(user.name.between("a", "Z")).then(1)
.when(user.name.between("", "")).then(2)
.otherwise(3));
}
}
return null;
}

private OrderSpecifier<?> getDirectionByName(Pageable pageable) {
for (Sort.Order order : pageable.getSort()) {
return order.getDirection().isAscending() ? user.name.asc() : user.name.desc();
}
return null;
}
 
코드는 이렇게 구성되어있고 나오는 쿼리는 이렇습니다.
 
select user0_.name

from users user0_
where user0_.uuid in
('0685167f0ebd4d128c8607044e893e60', '081b37bc3661429395d366f015f55f9c', '099dcb0174bd4de693226d8785499431')
order by case when user0_.name between '' and '' then 1 when user0_.name between 'a' and 'Z' then 2 else 3 end asc,
user0_.name asc
limit 10;
 
 
제가 원하는 결과를 뽑으려면
 
select user0_.name

from users user0_
where user0_.uuid in
('0685167f0ebd4d128c8607044e893e60', '081b37bc3661429395d366f015f55f9c', '099dcb0174bd4de693226d8785499431')
order by case when user0_.name between '' and '' then 1 when user0_.name between 'a' and 'Z' then 2 else 3 end ,
user0_.name asc
limit 10;
위의 쿼리 처럼 되어야 나오는데요...
 
 
orderBy 구절에서 OrderSpecifier 타입만 넣을 수 있기 때문에 direction을 필수 적으로 넣어야 합니다..
어떻게 해야할까요.........

답변 1

답변을 작성해보세요.

1

안녕하세요. 김진태님

이 부분은 저도 잘 모르겠습니다.

혹시 아시는 분 있으면 답변 부탁드려요.

감사합니다.