반응형
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 강의
반응형
'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 |