본문 바로가기
Spring/Querydsl

Query DSL - Subquery

by 행운의나무 2022. 7. 5.
728x90
반응형

 

Query DSL 기초

2022.06.24 - [Spring/Querydsl] - Query DSL 시작하기

 

Query DSL 시작하기

참고 Querydsl 기본문법 학습하기 Querydsl 다이나믹 쿼리 사용하기JPA와 비교 JPA 비교해 JPA의 장점 가독성이 좋다. JPA에서 기본적으로 제공하는 기능을 넘어서는 기능은 일반적으로 native query 옵션으

twer.tistory.com

Query DSL JOIN

2022.07.03 - [Spring/Querydsl] - Query DSL - Join

 

Query DSL - Join

첫 번째 파라미터에 조인 대상을 지정하고, 두 번째 파라미터에 별칭으로 사용할 Q 타입 지정 DB Team Table Member Table 기본 조인 join(조인 대상, 별칭으로 사용할 Q타입) join(), innerJoin() : 내부 조인..

twer.tistory.com

  • com.querydsl.jpa.JPAExpressions 사용
  • subquery는 가능한 한 join으로 변경하는 것이 좋다.
  • 비즈니스 로직은 Service 계층에서 해결하는 것이 좋다.
  • 데이터 포맷은 View 계층에서 해결하는 것이 좋다.

DB

  • Team Table

team table

  • Member 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://velog.io/@shlee327/Querydsl-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EB%B2%95-%ED%95%99%EC%8A%B5%ED%95%98%EA%B8%B0

https://hjhng125.github.io/querydsl/querydsl-subquery/

쿠팡으로 연결 클릭

 

제주삼다수 그린

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음

반응형

'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