상황
QueryDSL을 사용하여 목록을 조회하는 쿼리를 작성하던 중에 정렬 조건을 동적으로 처리해야 했다.
QueryDSL로 정렬하는 정적, 동적 방법을 알아보고 정리해보겠다.
실행환경 및 버전
- QueryDSL: 5.0.0
- JDK : open JDK 11
- Spring Boot : 2.7.9
✔️정적 정렬
// Sample.java의 Qclass가 생성되어 있다고 가정한다.
public List<Sample> findSampleList(String code) {
return jpaQueryFactory.select(
Projections.constructor(Sample.class,
sample.no,
sample.title
)
)
.from(sample)
.orderBy(sample.no.asc()) // 정적 정렬 방법
.fetch();
}
📌 orderBy() 에 sample.no.asc() 를 사용하여 no 값이 정순으로 정렬되도록 구현했다.
✔️동적 정렬
이제 위에 코드에서 변형을 해보자.
만약 매개변수로 들어온 code 값에 따라 정렬 기준이 달라지면 어떻게 구현할까?
이럴 경우를 위해 QueryDSL 은 OrderSpecifier class 를 제공하고 있다.
OrderSpecifier 을 사용한 동적 정렬 방법을 코드를 통해 살펴보자.
// Sample.java의 Qclass가 생성되어 있다고 가정한다.
public List<Sample> findSampleList(String code) {
return jpaQueryFactory.select(
Projections.constructor(Sample.class,
sample.no,
sample.title
)
)
.from(sample)
.orderBy(createOrderSpecifier(code)) // 동적 정렬 방법
.fetch();
}
private OrderSpecifier[] createOrderSpecifier(String code) {
List<OrderSpecifier> orderSpecifiers = new ArrayList<>();
if(code.equals("A")) {
orderSpecifiers.add(new OrderSpecifier(Order.DESC, sample.no));
}else if(code.equals("B")) {
orderSpecifiers.add(new OrderSpecifier(Order.ASC, sample.createDt));
}
return orderSpecifiers.toArray(new OrderSpecifier[orderSpecifiers.size()]);
}
createOrderSpecifier 메소드를 처럼 OrderSpecifier 객체를 만들고, 필요한 조건에 따라 손쉽게 정렬 조건을 추가할 수 있다.
위 코드에서 OrderSpecifier을 List로 선언한 이유는 요구사항에 따라 여러 개의 정렬 조건이 추가될 수도 있기 때문이다.
'Back > JPA' 카테고리의 다른 글
[JPA] 이전글, 다음글 조회(native query, QueryDSL 사용) (0) | 2023.12.19 |
---|---|
[JPA, QueryDSL] intellij QClass import static 자동완성 단축키 (0) | 2023.03.15 |
[JPA] Spring Data JPA (0) | 2022.03.04 |
[JPA] @OneToMany 관계에서 delete 하기 (0) | 2022.02.25 |
[JPA] 연관관계 매핑, @OneToMany @ManyToOne @OneToOne @ManyToMany (0) | 2021.12.15 |
댓글