본문 바로가기
Develop/Spring

[querydsl] querydsl 에서 서브쿼리 사용하는 법

by 코딩의성지 2021. 7. 5.

하이 .. 

 

오늘은 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 을사용하는 방법을 사용하자.

 

반응형

댓글