[Querydsl] Case문

Welcome to Seoyun Dev Log·2023년 4월 27일
0

JPA

목록 보기
5/15

1. Case문

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

가급적이면 계산하는 로직은 DB에서가 아닌 애플리케이션에서 계산하도록 하는 것이 좋다
DB는 데이터를 적재하고 그룹핑, 조회하는 목적에서 사용하고
계산하는 로직은 애플리케이션에서 하는 것이 좋다

//심플 쿼리
@DisplayName("basicCase")
    @Test
    void basicCase() {
        jpaQueryFactory
                .select(member.age
                        .when(10).then("열살")
                        .when(20).then("스무살")
                        .otherwise("기타"))
                .from(member)
                .fetch();
    }

    @DisplayName("complexCase")
    @Test
    void complexCase() {
        jpaQueryFactory
                .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();
    }

2. 상수, 문자 더하기

  • 상수가 필요하면 Expressions.constant(xxx) 사용
    위와 같이 최적화가 가능하면 SQL에 constant 값을 넘기지 않는다.
    상수를 더하는 것 처럼 최적화가 어려우면 SQL에 constant 값을 넘긴다.
@DisplayName("constant")
    @Test
    void constant() {
        jpaQueryFactory
                .select(member.username, Expressions.constant("A"))
                .from(member)
                .fetch();

    }
  • 문자 더하기
    📌참고: member.age.stringValue() 부분이 중요한데,
    문자가 아닌 다른 타입들은 stringValue() 로 문자로 변환할 수 있다.
    이 방법은 ENUM을 처리할 때도 자주 사용한다.
    @DisplayName("concat")
    @Test
    void concat() {
        //{username}_{age}
        List<String> result = jpaQueryFactory
                .select(member.username.concat("_")
                        .concat(member.age.stringValue()))//type이 맞아야한다.
                .from(member)
                .fetch();

    }

String 타입으로 변환하기

  • stringValue()
profile
하루 일지 보단 행동 고찰 과정에 대한 개발 블로그

0개의 댓글