728x90
반응형
Query DSL 기초
2022.06.24 - [Spring/Querydsl] - Query DSL 시작하기
Query DSL JOIN
2022.07.03 - [Spring/Querydsl] - Query DSL - Join
- com.querydsl.jpa.JPAExpressions 사용
- subquery는 가능한 한 join으로 변경하는 것이 좋다.
- 비즈니스 로직은 Service 계층에서 해결하는 것이 좋다.
- 데이터 포맷은 View 계층에서 해결하는 것이 좋다.
DB
- Team Table
- Member Table
select 절의 subquery
@Repository
public class MemberRepositorySupport extends QuerydslRepositorySupport {
private final JPAQueryFactory queryFactory;
public MemberRepositorySupport(JPAQueryFactory queryFactory) {
super(Member.class);
this.queryFactory = queryFactory;
}
public List<Tuple> findMemberSelectSubquery(){
return queryFactory
.select(member.name,
JPAExpressions.select(member.age.avg()).from(member)
)
.from(member)
.fetch();
}
}
/* ======================= */
@SpringBootTest
class MemberRepositorySupportTest {
@Autowired
private MemberRepositorySupport memberRepositorySupport;
@Test
void select_subquery(){
List<Tuple> memberSelectSubquery = memberRepositorySupport.findMemberSelectSubquery();
for(Tuple tuple : memberSelectSubquery){
System.out.println(tuple);
}
}
}
/* ======================= */
/*
결과
[test1, 14.0]
[test2, 14.0]
[test3, 14.0]
*/
from 절의 subquery
- JPA, JPQL 에서는 from 절의 서브쿼리를 지원하지 않는다.
- querydsl은 JPQL의 빌더 역할이기 때문에 JPQL이 지원하지 않는 문법은 사용할 수 없다.
where 절의 subquery
- eq() 사용
- goe() 사용 (>= 함수)
- in() 사용
@Repository public class MemberRepositorySupport extends QuerydslRepositorySupport { private final JPAQueryFactory queryFactory; public MemberRepositorySupport(JPAQueryFactory queryFactory) { super(Member.class); this.queryFactory = queryFactory; } // eq() 사용 public Member findMemberWhereSubqueryEq(){ return queryFactory .selectFrom(member) .where(member.age.eq( JPAExpressions .select(member.age.max()) .from(member)) ) .fetchOne(); } // goe() 사용 (>=함수) public List findMemberWhereSubqueryGoe(){ return queryFactory .selectFrom(member) .where(member.age.goe( JPAExpressions .select(member.age.avg()) .from(member) )) .fetch(); } // in() 사용 public List findMemberWhereSubqueryIn(){ return queryFactory .selectFrom(member) .where(member.age.in( JPAExpressions .select(member.age) .from(member) .where(member.age.gt(10)) )) .fetch(); } } /* ======================= */ @SpringBootTest class MemberRepositorySupportTest { @Autowired private MemberRepositorySupport memberRepositorySupport; @Test void where_subquery(){ // 가장 나이가 많은 회원 - eq() Member memberWhereQueryEq = memberRepositorySupport.findMemberWhereSubqueryEq(); System.out.println("eq : " + memberWhereQueryEq.getName()); // 평균 나이 이상의 회원리스트 - goe() List<Member> memberWhereSubqueryGoe = memberRepositorySupport.findMemberWhereSubqueryGoe(); for (Member member : memberWhereSubqueryGoe){ System.out.println("goe : " + member.getName()); } // 10살 이상 - in() List<Member> memberWhereSubqueryIn = memberRepositorySupport.findMemberWhereSubqueryIn(); for(Member member : memberWhereSubqueryIn){ System.out.println("in : " + member.getName()); } } } /* ======================= / / 결과 eq : test2 goe : test2 in : test2 in : test3 */
참고
https://hjhng125.github.io/querydsl/querydsl-subquery/
파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
반응형
'Spring > Querydsl' 카테고리의 다른 글
Query DSL 시작하기 (0) | 2022.12.12 |
---|---|
Query DSL - Dynamic Query (0) | 2022.07.06 |
Query DSL - Paging (0) | 2022.07.06 |
Query DSL - CASE (0) | 2022.07.05 |
Query DSL - Join (0) | 2022.07.03 |