Spring/QueryDSL

Case 문 & 상수, 문자 더하기

느리지만 꾸준하게 2022. 4. 20. 05:15

JPA가 지원하는 CASE 문은 Querydsl에서도 다 지원이 된다.

 

 

단순한 조건 부터 먼저 test 돌려보자.

@Test
public 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
public void complexCase() {
    List<String> result = queryFactory
            // 복잡할 때는 CaseBuilder를 쓰는데
            .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();

    for (String s : result) {
        System.out.println("s = " + s);
    }
}

 

실행결과가 아래와 같다.

// 기본적인 JPQL 구문이랑 같고

/* select
        case 
            when (member1.age between ?1 and ?2) then ?3 
            when (member1.age between ?4 and ?5) then ?6 
            else '기타' 
        end 
    from
        Member member1 */ 
        
        // SQL도 아래와 같이 나온다.
        select
            case 
                when member0_.age between ? and ? then ? 
                when member0_.age between ? and ? then ? 
                else '기타' 
            end as col_0_0_ 
        from
            member member0_




s = 0~20살
s = 0~20살
s = 21~30살
s = 기타

 

이걸 정말 써야할까?

실무에서는 db에서 해결하지말자.

db에서는 필요한 데이터를 필터링 하고 grouping을 하고 최소한의 작업으로 데이터를 줄이는 일만 하자.

 

열살 스무살 이렇게 전환하고 보여주는 작업을 db에서 하지말자는 말이다. 애플리케이션이나 프레젠테이션 레이어에서 해결을 하자.

 

비록 실무에서 스프링으로 업무한 적은 없지만 이렇게 마음에 새겨두고 지식을 쌓아나가자. 야밤에 뻘소리를 써본다...

 

 

 

 

 

 

상수, 문자 더하기

 

일단 상수를 출력해보면

@Test
public void constanc() {
    List<Tuple> result = queryFactory
            
            // 상수 A를 쿼리 결과에 넣어서 가지고 오는것
            .select(member.username, Expressions.constant("A"))
            .from(member)
            .fetch();

    for (Tuple tuple : result) {
        System.out.println("tuple = " + tuple);
    }


}
// 신기한게 JPQL에서는 안나간다.
/* select
        member1.username 
    from
        Member member1 */ 
        
        
        // 결과에서만 상수를 받게 된다.
        select
            member0_.username as col_0_0_ 
        from
            member member0_

tuple = [member1, A]
tuple = [member2, A]
tuple = [member3, A]
tuple = [member4, A]

 

 

 

 

문자를 더해보자.

// 문자 더하기
@Test
public void concat() {

    // {username}_{age}
    List<String> result = queryFactory
            // concat는 문자만 된다. stringValue를 넣자.
            .select(member.username.concat("_").concat(member.age.stringValue()))
            .from(member)
            .where(member.username.eq("member1"))
            .fetch();

    for (String s : result) {
        System.out.println("s = " + s);
        
    }
}

 

 

.stringValue 쓸일이 많은데 ENUM타입 같은 경우는 enum이기 때문에 값이 안나온다. 이때 .stringValue을 쓰면 된다.

// JPQL concat로 조합

/* select
        concat(concat(member1.username,
        ?1),
        str(member1.age)) 
    from
        Member member1 
    where
        member1.username = ?2 */ 
        
        // SQL concat로 조합이 되어있다.
        // stringValue로 바꿨기 때문에 age를 char로 변환했다. 재밌다.
        select
            ((member0_.username||?)||cast(member0_.age as char)) as col_0_0_ 
        from
            member member0_ 
        where
            member0_.username=?





s = member1_10

 

 

 

 

 

 

 

 

 

 

<출처 김영한: 실전! Querydsl >

https://www.inflearn.com/course/Querydsl-%EC%8B%A4%EC%A0%84/dashboard

 

실전! Querydsl - 인프런 | 강의

Querydsl의 기초부터 실무 활용까지, 한번에 해결해보세요!, - 강의 소개 | 인프런...

www.inflearn.com

 

'Spring > QueryDSL' 카테고리의 다른 글

프로젝션 결과 반환 - DTO 조회  (0) 2022.04.21
프로젝션과 결과 반환 - 기본  (0) 2022.04.20
서브 쿼리  (0) 2022.04.20
조인 - 페치 조인  (0) 2022.04.20
조인 - on 절  (0) 2022.04.20