QueryDSL 기본 문법 - 3
서브 쿼리
JPAExpressions를 사용하면 된다.
@Test
void subQuery() {
QMember memberSub = new QMember("memberSub");
List<Member> result = query
.selectFrom(member)
.where(member.age.eq(
JPAExpressions
.select(memberSub.age.max())
.from(memberSub)
))
.fetch();
assertThat(result).extracting("age").containsExactly(40);
}나이가 가장 많은 회원을 조회한다.
서브 쿼리는 alias가 겹치면 안 되기 때문에 Q 타입을 하나 추가로 생성해준다.
@Test
void subQueryGoe() {
QMember memberSub = new QMember("memberSub");
List<Member> result = query
.selectFrom(member)
.where(member.age.goe(
JPAExpressions
.select(memberSub.age.avg())
.from(memberSub)
))
.fetch();
assertThat(result).extracting("age").containsExactly(30,40);
}나이가 평균 이상(goe, >=)인 회원을 조회한다.
in절도 가능하다. 10살 초과(gt, >)인 회원을 조회한다.
select절에 서브 쿼리도 가능하다. 모든 회원의 이름하고 평균 나이가 조회된다.
JPAExpressions는static import가능하다.
CASE 문
단순한 조건
복잡한 조건
QueryDSL은 자바 코드로 작성하기 때문에 다음처럼도 가능하다.
rankPath에 복잡한 조건을 변수로 선언해서 select절, orderBy절에서 함께 사용했다.
0-30살이 아닌 회원을 가장 먼저 출력하고, 다음에 0-20살, 다음에 21~30살을 출력한다.
상수, 문자 더하기
Expressions.constant()를 사용한다.
이름과 문자를 함께 출력한다.
이름 + - + 나이를 출력한다.
member.age.stringValue() : 문자가 아닌 다른 타입들은 StringValue()로 문자로 변환할 수 있다. ENUM을 처리할 때 유용하다.
Last updated