Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

DOing

[Querydsl] 서브쿼리 본문

JPA

[Querydsl] 서브쿼리

mangdo 2021. 8. 4. 23:54

 

서브쿼리

: 쿼리안의 쿼리

: com.querydsl.jpa.JPAExpressions 사용(이를 static import로 해서 깔끔하게 정리가능!)

: where절 뿐만아니라 select절에도 가능하다.

    @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) // member 테이블 다시 조회
                ))
                .fetch();
                
        // in 서브쿼리
        List<Member> result = queryFactory
                .selectFrom(member)
                .where(member.age.in(
                        JPAExpressions
                                .select(memberSub.age)
                                .from(memberSub)
                                .where(memberSub.age.gt(10))
                ))
                .fetch();
    }

 

From절 서브쿼리와 SQL 범위에 관하여

: where 절과 select절 서브쿼리는 지원하지만. from절 서브쿼리는 JPA가 지원하지 않기때문에 Querydsl에서도 지원하지 않는다.

: from절 서브쿼리 해결방안

     1. 서브쿼리 -> join 변경

     2. 애플리케이션에서 쿼리를 두번에 나눠서 사용한다

     3. Native SQL 을 사용한다. 

 

 From 절 서브쿼리를 사용하는 이유에 SQL에 너무 많은 로직을 넣었기 때문인 경우들이 있다.

 여담이지만 SQL에 너무 많은 로직을 넣게되면 쿼리가 복잡지면서 SQL 재활용성이 떨어지고 유지/보수성 떨어지게될 수 있다. SQL은 데이터를 가져오는 것에 집중하고, 필요하면 애플리케이션에서도 로직을 처리하고, 프레젠테이션로직은 화면단에서 하는게 맞다고 생각한다. 한방쿼리? 글쎄... 
  개인적으로 한참 SQL을 좋아하던 시절에 그런 쿼리가 멋있다고 생각한 적이 있어서 복잡한 쿼리를 만들어서 프로젝트에 적용한 경험들이 있었다. 굉장히 좋은 기억이 아니였다. 쿼리를 짠 나 자신외엔 아무도 건들 수 없었고... 나역시도 나중에 쿼리를 수정할 일이 있어서 다시 쳐다보는데 정말 보기 싫었다. 


'JPA' 카테고리의 다른 글

[JPA] Fetch Join  (1) 2021.08.06
[Querydsl] 튜플이나 DTO로 결과 반환하기  (0) 2021.08.05
[Querydsl] Join  (0) 2021.08.04
[Querydsl] 정렬, 페이징, 집계 함수, 그룹 함수  (0) 2021.08.04
[Querydsl] where 조건과 결과 조회  (0) 2021.08.04