반응형
JPAExpression
To create a subquery you use the static factory methods of JPAExpressions.
example
queryFactory.selectFrom(department)
.where(department.size.eq(
JPAExpressions.select(d.size.max()).from(d)))
.fetch();
where 절에 서브쿼리 적용하기 (eq)
@Test
public void subQuery() throws Exception {
QMember memberSub = new QMember("memberSub");
List<Member> result = queryFactory
.selectFrom(member)
.where(member.age.eq(
JPAExpressions
.select(memberSub.age.max())
.from(memberSub)))
.fetch();
}
- JPAExpressions를 where절에 작성하며 일반 sql처럼 비교하려는 조건을 작성해 줍니다.
(goe사용하기)
public void subQueryGoe() throws Exception {
QMember memberSub = new QMember("memberSub");
List<Member> result = queryFactory
.selectFrom(member)
.where(member.age.goe(
JPAExpressions
.select(memberSub.age.avg())
.from(memberSub)))
.fetch();
}
select 절에 subquery 작성하기
List<Tuple> fetch = queryFactory
.select(member.username,
JPAExpressions
.select(memberSub.age.avg())
.from(memberSub))
.from(member)
.fetch();
- select 절에 단일 값을 반환하는 서브 쿼리를 작성할 수 있습니다.
from 절의 서브 쿼리 한계
JPA JPQL 서브 쿼리의 한계점으로 from 절의 서브쿼리는 지원하지 않는다. (Querydsl에서도 지원하지 않음)
해결 방안
- Subquery를 join으로 변경한다.
- 애플리케이션에서 쿼리를 2번 분리해서 실행한다.
참고 자료
Querydsl Reference Guide
The Java 6 APT annotation processing functionality is used in Querydsl for code generation in the JPA, JDO and Mongodb modules. This section describes various configuration options for the code generation and an alternative to APT usage. 3.3.1. Path initi
querydsl.com
김영한 님의 querydsl 강의
반응형
'Spring Framework > QueryDSL' 카테고리의 다른 글
Querydsl 날짜 연산 문제 해결 : Interval 예약어 미지원 - Java 날짜 객체를 사용하기 (1) | 2024.11.15 |
---|---|
Querydsl OrderSpecifier를 활용한 동적 정렬 방법 - Pathbuilder, Sort (0) | 2024.10.18 |
[Querydsl] QueryDSL @QueryProjection 프로젝션 활용법 : DTO, Bean, Field, Constructor 사용법 (0) | 2024.09.16 |
[QueryDsl] QueryDsl groupBy 여러 개 적용하기 (0) | 2024.08.10 |
[QueryDsl] QueryDsl 페이징, 검색, 필터링 쿼리 구현 - 페이징 최적화, BooleanExpression (2) | 2024.07.30 |