-
카테고리
-
세부 분야
백엔드
-
해결 여부
미해결
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