하이 ..
오늘은 querydsl에서 서브쿼리를 사용하는 방법을 정리해 두려고 한다.
1. where 절 서브 쿼리
1) 기본 사용 법
기본적인 사용 방법을 아래 예제로 만들었다. 여기서 주의해야할 점은 Q 도메인을 서브 쿼리에서 사용할 놈은 따로 만들어 줘야한다는 것이다. 그리고 서브쿼리는 JPAExpressions라는 것을 이용해서 구현할 수 있는데, Q 도메인을 Static 처리한 것 처럼 이것 역시 처리가 가능하다.
QMember subMember = new QMember("subMember");
List<Member> result = queryFactory
.selectFrom(member)
.where(member.age.eq(
//JPAExpressions.
select(subMember.age.min())
.from(subMember) // 이거에 대한 결과가 나올거임
))
.fetch();
2) goe, loe 등을 활용한 수치 비교 서브쿼리
네이티브 SQL 문처럼 수치 비교를 할수 있는 기능이 있다. goe (크거나 같은) , loe (작거나 같은), gt (큰) , lt (작은) 이런식으로 비교가 가능하다.
QMember subMember = new QMember("subMember");
// goe, loe 등 사용하여 수치 비교하는 서브쿼리 가능
List<Member> result = queryFactory
.selectFrom(member)
.where(member.age.loe(
//JPAExpressions.
select(subMember.age.avg())
.from(subMember) // 이거에 대한 결과가 나올거임
))
.fetch();
3) in 쿼리 사용
querydsl 에서는 in 쿼리도 사용이 가능하다.
QMember subMember = new QMember("subMember");
//in query도 사용 가능함
List<Member> result = queryFactory
.selectFrom(member)
.where(member.age.in(
//JPAExpressions.
select(subMember.age)
.from(subMember)
.where(subMember.age.lt(40))// 이거에 대한 결과가 나올거임
))
.fetch();
2. select 절 서브쿼리 사용
select 절에서도 서브쿼리를 사용할 수 있다.
QMember subMember = new QMember("subMember");
List<Tuple> result = queryFactory
.select(member.userName,
//JPAExpressions.
select(subMember.age.avg())
.from(subMember)
)
.from(member)
.fetch();
3. from 절 서브쿼리 사용
아쉽지만 querydsl에서 from 절에서 서브쿼리 사용은 불가능하다.
from 절의 서브쿼리는 서브쿼리를 join으로 변경하거나,
애플리케이션의 로직에서 쿼리를 두번을 분리해서 실행하거나,
그냥 native SQL 을사용하는 방법을 사용하자.
반응형
'Develop > Spring' 카테고리의 다른 글
[querydsl] querydsl에서 projection 다루기 (0) | 2021.07.07 |
---|---|
[querydsl] concat 사용법 (문자열 붙이기) (1) | 2021.07.07 |
[querydsl] queryDsl 기본 문법 정리 - 조인 ( inner join, theta join , on 절 사용, left outer join, right outer join, fetch join) (0) | 2021.07.04 |
JPQL vs QueryDSL 간단 비교 (1) | 2021.06.30 |
[querydsl] queryDsl 기본 문법 정리 - fetch, sort, paging, aggregation (0) | 2021.06.30 |
댓글