본문 바로가기
개발자 전향 프로젝트

QueryDsl - Case When과 Concat 활용법

by 샘오리 2023. 4. 11.
728x90
반응형

CASE WHEN

 

QueryDsl에서 동적쿼리를 사용하고 싶을 때, Decode를 사용하고 싶을 때

활용되는 Case When은 크게 두가지로 사용할 수 있다.

 

1. CaseBuilder를 직접 넣는 방법

.select(Projections.bean(Member.class,
    member.name,
    new CaseBuilder()
    .when(member.age.lt(10)).then("어린이")
    .when(member.age.lt(20)).then("학생")
    .when(member.age.lt(30)).then("청년")
    .otherwise("어른")
.fetch();

 

2. CaseBuilder를 임의의 변수로 선언한 뒤 변수를 넣는 방법

 Expression<String> caseByAge = new CaseBuilder()
    .when(member.age.lt(10)).then("어린이")
    .when(member.age.lt(20)).then("학생")
    .when(member.age.lt(30)).then("청년")
    .otherwise("어른");
   .select(Projections.fields(Member.class,
            member.name,
            caseByAge,
    ))
    .from(member)

*가명을 따로 지정해주지 않았기 때문에 오류가 발생한다. 

가명은 view에서 호출하고 싶은 이름을 지정하면 된다.

...
    .otherwise("어른")
    .as(member.age) // entity에 있는 필드일 경우
    혹은 
    .as("age") // entity에 없는 필드일 경우
.fetch();

when절에 Predicate 대신 Boolean Expression을 넣고 싶다면 아래와 같이 하면된다.

.when(Expressions.asBoolean(True or False로 반환받을 내용).isTrue()).then

.when(Expressions.asBoolean(True or False로 반환받을 내용).isFalse()).then

Concat

보통 문자열 이어 붙이기는 VIEW에서 해도 되지만 어떠한 이유에서 인지 쿼리에서부터 어떠한 지정된 포맷으로 쏴주고

앞단에서는 날아온 포맷 그대로 표출만 해주고 싶을 때 이러한 문자열 이어붙이기를 활용한다. 이렇게 되면 출력해주는 앞단은 포맷 상관없이 비교적 편하게 코드를 짤 수 있다.

 

    .select(player.name.concat(": ").concat(player.age.stringValue()))
    .from(player)

 

*age와 같이 데이터 타입이 다를경우 String화 시켜줘야 명색이 문자열 붙이기인 Concatenation이 작동한다.

 

이런식이 되면 name이 손흥민이고 age는 30일 때

player.name을 앞단에서 호출하면 age가 자동으로 따라올 뿐만 아니라

아래와 같은 형식으로 출력되는 것이다. 

손흥민: 30 
728x90
반응형