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);
}
}
'스프링 > QueryDsl' 카테고리의 다른 글
[QueryDsl] 동적쿼리짜기 (0) | 2022.03.11 |
---|---|
[QueryDsl] Projection(select에서 뭘 가져올까?)종류에 따른 결과 반환 (Tuple, Dto로 반환)하는 법 (0) | 2022.03.11 |
[QueryDsl] 서브쿼리 사용하기 (0) | 2022.03.10 |
[QueryDsl] Join + On절 + Fetch join (0) | 2022.03.08 |
[QueryDsl] 정렬, 페이징, Tuple을 이용한 특정 값 Select (max,min,avg,sum 등) (0) | 2022.03.06 |