ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Querydsl - Case 문
    JPA/Querydsl 2023. 8. 13. 00:32

    기본 Case 문

    @Test
    public void basicCase() {
        queryFactory
                .select(member.age
                        .when(10).then("열살")
                        .when(20).then("스무살")
                        .otherwise("기타"))
                .from(member)
                 .fetch();
    }

    데이터의 값에 따라 매핑을 해서 데이터를 바꿔서 받아오는 것이다.

     

     

    @Test
    public 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("기타"))
                .from(member)
                .fetch();
    }

    좀 어려운 케이스인데, 이 때에도 딱히 어려운 것이 없다.

     

     

     

    1. 0 ~ 30살이 아닌 회원을 가장 먼저 출력

    2. 0 ~ 20살 회원 출력

    3. 21 ~ 30살 회원 출력

    위와 같은 순서로 출력하고 싶으면 아래와 같이 코드를 짜면 된다.

    @Test
    public void complexCase() {
        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 = tuple.get(rankPath);
            System.out.println("username = " + username + " age = " + age + " rank = " + rank);
        }
    }

    rankPath라는 복잡한 조건을 변수로 선언한 다음에 rankPath.desc()로 정렬을 하면 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

     

     

     

     

    case 문이 필요할 때가 있을 수도 있지만 db에서는 데이터를 가져오는 역할만 하고 나머지는 애플리케이션 로직에서 계산하는 것이 좋다고 생각한다.

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

    Querydsl의 동적 쿼리  (0) 2023.08.13
    Dto로 프로젝션 결과 반환  (0) 2023.08.13
    Querydsl - 서브 쿼리  (0) 2023.08.13
    Querydsl - 조인  (0) 2023.08.13
    Querydsl - 정렬과 페이징, 집합  (0) 2023.08.12
Designed by Tistory.