Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 페이지네이션 최적화
- foreign key constraint fails
- kafka connect
- Pagination Optimization
- Cannot delete or update a parent row: a foreign key constraint fails
- git reflog
- 문자열 검증
- kafka-connect
- 1452
- debezium
- Path Variable
- 1450
- jdbc connector
- Cannot add or update a child row: a foreign key constraint fails
- constraint fails
- Query String
- git rebase -i
- reflog
- programmers
- API 설계
- kafkaconnect
- Late row lookup
- Git
- Invalid character found in method name
- 참조무결성
- 제약 조건
- code --no-sandbox
- 페이지네이션
- 23000
- event loop
Archives
- Today
- Total
Kawaii_Jordy
[JPA] QueryDsl에서 Custom Sorting 하는 법 본문
우선 Order, Path, fieldName을 전달하면 OrderSpecifier 객체를 리턴하는 Util 클래스를 작성해서 Sort시 마다 사용할 수 있도록 한다.
- Path 파라미터는 compileQuerydsl 빌드를 통해서 생성된 Q타입 클래스의 객체이다.
- Sort의 대상이 되는 Q타입 클래스 객체를 전달한다.
import com.querydsl.core.types.Order;
import com.querydsl.core.types.OrderSpecifier;
import com.querydsl.core.types.Path;
import com.querydsl.core.types.dsl.Expressions;
public class QueryDslUtil {
public static OrderSpecifier<?> getSortedColumn(Order order, Path<?> parent, String fieldName) {
Path<Object> fieldPath = Expressions.path(Object.class, parent, fieldName);
return new OrderSpecifier(order, fieldPath);
}
}
사용 방법은 아래와 같이 Pageable 객체의 sort 필드를 체크해서 OrderSpecifier 리스트 객체를 생성한다.
private List<OrderSpecifier> getAllOrderSpecifiers(Pageable pageable) {
List<OrderSpecifier> ORDERS = new ArrayList<>();
if (!isEmpty(pageable.getSort())) {
for (Sort.Order order : pageable.getSort()) {
Order direction = order.getDirection().isAscending() ? Order.ASC : Order.DESC;
switch (order.getProperty()) {
case "id": OrderSpecifier<?> orderId = QueryDslUtil.getSortedColumn(direction, QRoom.room, "id");
ORDERS.add(orderId);
break;
case "user": OrderSpecifier<?> orderUser = QueryDslUtil.getSortedColumn(direction, QUser.user, "name");
ORDERS.add(orderUser);
break;
case "category": OrderSpecifier<?> orderCategory = QueryDslUtil.getSortedColumn(direction, QRoom.room, "category");
ORDERS.add(orderCategory);
break;
default:
break;
}
}
}
return ORDERS;
}
생성 된 OrderSpecifier 객체를 querydsl 검색의 orderBy 함수의 argument로 넣어준다.
public Page<RoomStatistic> search(CsRoomStatisticFilter filter, Pageable pageable) {
List<OrderSpecifier> ORDERS = getAllOrderSpecifiers(pageable);
JPAQueryFactory queryFactory = new JPAQueryFactory(em);
QueryResults<CsRoomStatistic> results = queryFactory
.select(Projections.constructor(
RoomStatistic.class,
room.id,
room.createdDate,
room.updatedDate,
user.name,
user.jobInfo.name,
room.category,
type.name
))
.from(room)
.join(user).on(room.createdUserId.eq(user.id)).fetchJoin()
.join(type).on(room.typeId.eq(type.id)).fetchJoin()
.where( room.createdDate.between(filter.getSearchStartDate(), filter.getSearchEndDate()) )
.orderBy(ORDERS.stream().toArray(OrderSpecifier[]::new))
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetchResults();
return new PageImpl<>(results.getResults(), pageable, results.getTotal());
}
'취준 > SPRING' 카테고리의 다른 글
QueryDsl - Date 작성시 Expressions.dateTemplate (0) | 2021.11.13 |
---|---|
[querydsl, mysql] DATE_FORMAT 등 이용해 groupby 사용하기 (0) | 2021.11.13 |
[Spring] Bean Validation (0) | 2021.07.22 |
QueryDSL을 효과적으로 실무에 적용하기 위한 고민 (0) | 2021.07.14 |
[ControllerAdvice] @ControllerAdvice, @ExceptionHandler 예외 처리방법 (0) | 2021.07.13 |
Comments