스프링/QueryDsl

[QueryDsl] Case문, 상수 출력, 특정 문자값 붙여 출력하기

nomoreFt 2022. 3. 10. 18:52

QueryDsl Case문 예제

쿼리를 사용할 때, 경우에 따라 다른 값으로 치환을 Data에서 바로 할 경우가 있다.

주로 화면에 Fit하게 가져올 때 사용할 것 같은데

DB는 그냥 퍼올려서 Stream으로 Dto생성해서 처리하는것보다 좋을지는 역시나 고민해봐야할 문제


기본 CASE문, caseBuilder CASE문

간단한 Case문

그냥 when(경우).then(치환글) 만 사용하면 된다.

말 그대로 간단한 경우

 @Test
    public void basicCase() throws Exception {
        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);
        }
    }

복잡한 Case문

복잡하다는 의미는 when(조건) 절에 조건들이 까다롭다는 의미이다.

이럴땐 package com.querydsl.core.types.dsl queryDsl이 제공하는 CaseBuilder 객체를 사용한다.
참고로 caseBuilder의 when과 그냥 Simple when은 받는 인자가 다르다.

caseBuilder의 when

public CaseWhen<A,Q> when(Predicate b) {
            return new CaseWhen<A,Q>(this, b);
        }

일반 Simple when

public CaseWhen<T, Q> when(D when) {
            return when(ConstantImpl.create(when));
        }
 @Test
    public void complexCase() throws Exception {
        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();
        for (String s : result) {
            System.out.println(s);
        }
    }

특정 상수와 문자열 연결하여 출력하기

그냥 끝에 특정 상수값 함께 출력하는 법

QueryDsl의 Expressions.constant를 사용한다.

 @Test
    public void constant() throws Exception {
        List<Tuple> result = queryFactory
                .select(member.username, Expressions.constant("A"))
                .from(member)
                .fetch();

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

문자열 연결하여 출력하는 법

concat을 통해 문자열 연결하는데, 해당 변수가 String이 아닐 경우 stringValue()를 붙여준다.

💥 stringValue()는 enum 타입들도 변환할 때 사용해준다.

        @Test
        public void concat() throws Exception {
            //username_age로 붙여 쓰기
            List<String> result = queryFactory
                    .select(member.username.concat("_").concat(member.age.stringValue()))//stringValue() enum타입들도 변환시에 유용하다.
                    .from(member)
                    .where(member.username.eq("member1"))
                    .fetch();

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