들어가며
Querydsl을 사용할때 조건절이 필요한 경우 CaseBuilder를 사용하여 Case When을 사용할 수 있다. 사용 방법은 아래와 같다.
코드 - 자바 & 코틀린
아래의 코드는 자바와 코틀린에서의 코드를 정리한다. 사용방법은 크게 다르지 않다. 미세한 차이가 있으니 아래를 참고해서 사용하자.
자바
@RequiredArgsConstructor
public class PointEventRepositoryImpl implements PointEventRepositoryCustom {
private final JPAQueryFactory queryFactory;
@Override
public List<PointCalculateAmount> calculateAmounts() {
return queryFactory
.select(Projections.fields(PointCalculateAmount.class,
new CaseBuilder()
.when(pointEvent.pointStatus.in(PointStatus.USE, PointStatus.USE_CANCEL))
.then(pointEvent.pointAmount.multiply(-1))
.otherwise(pointEvent.pointAmount).as("pointAmount"),
pointEvent.pointStatus
))
.from(pointEvent)
.fetch();
}
}
코틀린
class PointEventRepositoryImpl(
val queryFactory: JPAQueryFactory
): PointEventRepositoryCustom {
override fun calculateAmounts(): List<PointCalculateAmount> {
return queryFactory
.select(Projections.fields(PointCalculateAmount.class,
CaseBuilder()
.`when`(pointEvent.pointStatus.in(PointStatus.USE, PointStatus.USE_CANCEL))
.then(pointEvent.pointAmount.multiply(-1))
.otherwise(pointEvent.pointAmount)
.`as`("pointAmount"),
pointEvent.pointStatus
))
.from(pointEvent)
.fetch()
}
}
Case When 설명
1. 먼저 CaseBuilder를 통해 CaseWhen 문법이 시작된다.
2. When은 조건문이다. (여러 조건 사용 가능)
3. then은 when절이 true 인 경우 실행된다.
4. otherwise는 when절이 false일때 실행된다. (무조건 기술해야함.)
5. as는 alias를 의미하며 명시하지 않으면 일반적으로 Entity의 필드명이 자동으로 적용된다.
When절 여러개 사용
아래와 같이 여러개 사용이 가능하다.
override fun calculateAmounts(): List<PointCalculateAmount> {
return queryFactory
.select(Projections.fields(PointCalculateAmount.class,
CaseBuilder()
.`when`(pointEvent.pointStatus.in(PointStatus.USE, PointStatus.USE_CANCEL))
.then(pointEvent.pointAmount.multiply(-1))
.`when`(pointEvent.pointStatus.in(PointStatus.USE, PointStatus.USE_READY))
.then(pointEvent.pointAmount.multiply(0))
.otherwise(pointEvent.pointAmount)
.`as`("pointAmount"),
pointEvent.pointStatus
))
.from(pointEvent)
.fetch()
}
'QueryDSL' 카테고리의 다른 글
QueryDsl 사용 시 CrossJoin 발생하는 경우와 해결 방법 (0) | 2022.07.29 |
---|
댓글