인프런 커뮤니티 질문&답변

likebat님의 프로필 이미지
likebat

작성한 질문수

실전! Querydsl

join 후 sum 하는 방식과, CaseBuilder()를 이용한 sum 하는 방식의 차이.

해결된 질문

작성

·

1.6K

0

안녕하세요. 강사님. join 후 sum 하는 방식과 CaseBuilder 로 sum 하는 방식 중 어떤 게 나은지 궁금해서, 

질문 드리게 되었습니다.

총금액과 건수를 구하고자 할 때

 join을 한 후에 총금액과 카운트 건수를 계산하는 방식이 있고, (1번)

 CaseBuilder()를 이용하여 join 없이 총금액과 카운트 건수를 구하는 방식이 있는데(2번)

 두 개의 결과값은 같았습니다.

그런데 둘 중 어느 방법이 더 성능상이나, 구조상으로 나은지 알 수 있을까요?

(아니면 문제가 생길 수 있거나...)

1번.

=====================================================================

- B는 A와 1:1 연관관계

QA A = new QA(“A”);

QB autoB = new QB(“autoB”);

QB nonB = new QB(“nonB”);

   query.select(

        autoB.count(),               //건수

        autoB.amount.sum(),  //총금액

        nonB.count(),                 //건수

        nonB.amount.sum()   //총금액

    )

    .from(A)

    .leftJoin(A.B, autoB).on(A.B.isAutoTransfer.isTrue())     //autoB 자동결제

    .leftJoin(A.B,  nonB).on(A.B.isAutoTransfer.isFalse())   //nonN 자동결제 아님.

    .groupBy(groupby조건)

==================================================================

2번.

====================================================================

QA A = new QA(“QA”);

   query.select(        

        new CaseBuilder()

            .when(A.B.isAutoTransfer.isTrue())

            .then(1L)

            .otherwise(0L)

            .sum(),

        new CaseBuilder()

          .when(A.B.isAutoTransfer.isTrue())

          .then(A.B.amount)

          .otherwise(0L)

          .sum(),

        new CaseBuilder()

            .when(A.B.isAutoTransfer.isFalse())

            .then(1L)

            .otherwise(0L)

            .sum(),

        new CaseBuilder()

            .when(A.B.isAutoTransfer.isFalse())

            .then(A.B.amount)

            .otherwise(0L)

            .sum()

     )

    .from(A)

    .groupBy(groupby조건) 

======================================================================

답변 기다리겠습니다

감사합니다!

답변 1

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. likebat님

2번 방법은 가급적 사용하지 않는게 좋습니다. 다른 이유가 아니라 A.B와 같은 경로 표현식을 사용해서 묵시적 조인이 발생하기 때문에 그렇습니다.

CASE를 사용하든 하지 않든 그것은 크게 중요하지 않습니다. 그런데 실무에서 경로 표현식으로 묵시적 조인이 발생하는 것은 유지보수하기 어렵습니다.

경로표현식과 묵시적 조인은 JPA 기본편의 다음 강의를 다시 한번 참고해주세요^^

https://www.inflearn.com/course/ORM-JPA-Basic/lecture/21727?tab=curriculum

감사합니다.

likebat님의 프로필 이미지
likebat

작성한 질문수

질문하기