설명의 편의를 위해 예시를 둔다.
회원의 나이대로 내림차순하는데, 회원 이름으로 올림차순하며, 회원 이름이 없다면 마지막에 출력한다면 쿼리를 어떻게 해야할까?
// sample data
em.persist(generateMember(null, 100, null));
em.persist(generateMember("member5", 100, null));
em.persist(generateMember("member6", 100, null));
QueryDSL 쿼리
List<Member> result = queryFactory
.selectFrom(member)
.where(member.age.eq(100))
.orderBy(member.age.desc(), member.username.asc().nullsLast())
// 아래와 같이 nullsFirst 또한 가능
// .orderBy(member.age.desc(), member.username.asc().nullsFirst())
.fetch();
QueryDSL의 페이징은 정말 간단하다.
아래와 같이 메서드에 집어 넣어주기만하면된다.
List<Member> result = queryFactory
.selectFrom(member)
.orderBy(member.username.desc())
.offset(1)
.limit(2)
.fetch();
SubQuery
서브 쿼리의 가장 중요한 점은, 대상으로 하는 엔티티가 보통 같기 때문에 엘리어스를 필수로 주어야한다.
평균 나이보다 많은 사람을 구하는 서브쿼리는 아래와 같다.
QMember memberSub = new QMember("memberSub");
List<Member> result = queryFactory
.selectFrom(member)
.where(member.age.goe(
select(memberSub.age.avg())
.from(memberSub)
))
.fetch();
'JPA > QueryDSL' 카테고리의 다른 글
[QueryDSL] 6. 동적 쿼리(중요⭐️) - BooleanBuilder, Where 다중 파라미터 사용 (0) | 2023.12.06 |
---|---|
[QueryDSL] 5. QueryDSL의 프로젝션과 결과 반환, @QueryProjection (0) | 2023.12.06 |
[QueryDSL] 4. QueryDSL의 Join과 FetchJoin (0) | 2023.12.06 |
[QueryDSL] 2. QueryDSL 문법 VS JPQL 문법 비교 (0) | 2023.12.01 |
[QueryDSL] 1. QueryDSL 의존성과 기본 사용법 (0) | 2023.12.01 |