- 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();
정렬할 내용을 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
정상적으로 잘 출력이 된 모습이다.
참고 :