본문 바로가기
QueryDSL

Querydsl - CaseBuilder를 통한 Case When 사용 방법

by devLog by Ronnie's 2022. 2. 16.

들어가며


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

댓글