오봉이와 함께하는 개발 블로그

Querydsl - Case 문 본문

BE/JPA

Querydsl - Case 문

오봉봉이 2022. 9. 18. 01:34
728x90

Case 문

select, 조건절(where), order by에서 사용 가능하다.

단순한 조건

@Test
void basicCase() {
    List<String> result = queryFactory
            .select(member.age
                    .when(10).then("열살")
                    .when(20).then("스무살")
                    .otherwise("기타")
            )
            .from(member)
            .fetch();
    for (String s : result) {
        System.out.println("s = " + s);
    }
}

결과

s = 열살
s = 스무살
s = 기타
s = 기타

복잡한 조건

@Test
void complexCase() {
    List<String> result = queryFactory
            .select(new CaseBuilder()
                    .when(member.age.between(0, 20)).then("0~20")
                    .when(member.age.between(21, 30)).then("21~30")
                    .otherwise("etc")
            )
            .from(member)
            .fetch();
    for (String s : result) {
        System.out.println("s = " + s);
    }
}

결과

s = 0~20
s = 0~20
s = 21~30
s = etc

orderBy에서 Case 문 함께 사용하기 예제

예를 들어서 다음과 같은 임의의 순서로 회원을 출력하고 싶다면?

  1. 0 ~ 30살이 아닌 회원을 가장 먼저 출력
  2. 0 ~ 20살 회원 출력
  3. 21 ~ 30살 회원 출력
@Test
void orderByCase() {
    NumberExpression<Integer> rankPath = new CaseBuilder()
            .when(member.age.between(0, 20)).then(2)
            .when(member.age.between(21, 30)).then(1)
            .otherwise(3);
    List<Tuple> result = queryFactory
            .select(member.username, member.age, rankPath)
            .from(member)
            .orderBy(rankPath.desc())
            .fetch();
    for (Tuple tuple : result) {
        String username = tuple.get(member.username);
        Integer age = tuple.get(member.age);
        Integer rank = (Integer) tuple.get(rankPath);
        System.out.println("username = " + username + "age = " + age + "rank = " + rank);
    }
}
username = member4 age = 40 rank = 3
username = member1 age = 10 rank = 2
username = member2 age = 20 rank = 2
username = member3 age = 30 rank = 1

Querydsl은 자바 코드로 작성하기 때문에 rankPath처럼 복잡한 조건을 변수로 선언해서 select절, orderBy절에서 함께 사용할 수 있다.

하지만 이 기능을 정말 사용해야 할까?에 대한 의문이 생긴다.
DB는 데이터를 필터링하고 그룹화 할 수는 있지만, 최소한의 그룹화와 필터링을 해야하지 저렇게 데이터를 변환하는 경우는 거의 없다고 볼 수 있다.
위와 같은 예제들은 애플리케이션 내부에서 해결하는 것이 좋을 것이다.

인프런 김영한 지식공유자님 강의 : 실전! Querydsl
728x90

'BE > JPA' 카테고리의 다른 글

Querydsl - 프로젝션 결과 반환 (기본)  (0) 2022.09.18
Querydsl - 상수, 문자 더하기  (0) 2022.09.18
Querydls - 서브 쿼리  (0) 2022.09.18
Querydsl - 조인 (페치 조인)  (0) 2022.09.17
Querydsl - 조인 (on 절)  (0) 2022.09.17
Comments