Querydsl - Case, 상수&문자 더하기

HotFried·2024년 2월 25일
0

Querydsl

목록 보기
6/9

Case문

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

List<String> result = queryFactory
                .select(member.age
                        .when(10).then("열살")
                        .when(20).then("스무살")
                        .otherwise("기타"))
                .from(member)
                .fetch();

단순한 조건일때 위와 같이 when, then, otherwise문법을 이용해주면 된다.

But, 복잡한 조건이 존재할때는 CaseBuilder() 클래스를 이용하도록 한다.

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();

orderBy + case

정렬할 내용을 caseBuilder()를 통해 정의해준다.
이후 orderBy절에 해당 조건을 오름차순 or 내림차순으로 정렬하도록 조건을 달아주면 끝이다.

21~ 30살이 1순위
0~ 20살이 2순위
나머지가 정렬 3순위인 예제이다.

// 복잡한 조건은 rankPath처럼 변수로 선언해서 활용한다.
        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();

위 예제를 출력해보면 아래와 같은 결과가 나온다.

 username = member4 age = 40 rank = 3
 username = member1 age = 10 rank = 2
 username = member2 age = 20 rank = 2
 username = member3 age = 30 rank = 1

상수, 문자 더하기

Expressions 클래스를 이용해 더해주도록 한다.

상수

Tuple result = queryFactory
                .select(member.username, Expressions.constant("A"))
                .from(member)
                .fetchFirst();
result = [member1, A]

문자

String result = queryFactory
                .select(member.username.concat("_").concat(member.age.stringValue()))
                .from(member)
                .where(member.username.eq("member1"))
                .fetchOne();

문자 + 숫자이기 때문에 member.age의 경우 stringValue()를 이용해 문자로 변경 후 더해주도록 한다.

member1_10

정상적으로 잘 출력이 된 모습이다.


참고 :

실전! Querydsl

profile
꾸준하게

0개의 댓글