Case문
select, 조건절(where)에서 사용 가능
/*단순한 조건*/
// 10살, 20살, 나머지로 나누기
@Test
void basicCase() {
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 = " + s);
}
출력결과:
s = 기타
s = 열살
s = 스무슬
s = 열살
s = 스무슬
/*복잡한 조건*/ /*복잡한 조건에는 CaseBuilder를 사용한다.*/
// 0~20살, 21~30살, 나머지로 나누기
@Test
void complexCase() {
List<String> result = queryFactory
.select(new CaseBuilder()
.when(member.age.between(0, 10)).then("0~20살")
.when(member.age.between(21, 30)).then("21살~30살")
.otherwise("기타")
)
.from(member)
.fetch();
for (String s : result) System.out.println("s = " + s);
}
출력결과:
s = 기타
s = 0~20살
s = 기타
s = 0~20살
s = 기타
물론 case문을 제공하지만 위와 같은 예시는 DB에서 하지 말고 애플리케이션 로직으로 해결하는 것을 권장한다.
상수, 문자 더하기
상수가 필요하면 'Expression.constant(xxx)' 사용
@Test
void constant() {
List<Tuple> result = queryFactory.select(member.username, Expressions.constant("A"))
.from(member)
.fetch();
for (Tuple tuple : result) System.out.println("tuple = " + tuple);
}
출력결과:
tuple = [member5, A]
tuple = [member1, A]
tuple = [member2, A]
tuple = [member3, A]
tuple = [member4, A]
@Test
void concat() {
//username_age 로 하고싶음
List<String> result = queryFactory
.select(member.username.concat("_").concat(member.age.stringValue()))
.from(member)
.fetch();
for (String s : result) System.out.println("s = " + s);
}
출력결과:
s = member5_55
s = member1_10
s = member2_20
s = member3_10
s = member4_20
참고
member.age.stringValue() 부분이 중요한데, 문자가 아닌 다른 타입들은 stringValue()로 문자로 변환할 수 있다. 이 방법은 ENUM을 처리할 때도 자주 사용한다.
김영한님의 인프런 강의와 PDF를 바탕으로 정리하였습니다.
'JPA > Querydsl' 카테고리의 다른 글
Querydsl 08 - 동적 쿼리 (0) | 2022.01.20 |
---|---|
Querydsl 07 - 프로젝션과 결과반환 (0) | 2022.01.19 |
Querydsl 05 - 서브쿼리 (0) | 2022.01.18 |
Querydsl 04 - 조인 (0) | 2022.01.17 |
Querydsl 03 - 기본문법(정렬, 페이징, 집합) (0) | 2022.01.17 |