[java] Java Querydsl을 사용하여 그룹화 쿼리 작성하기

Java Querydsl은 SQL 쿼리를 자바 코드로 작성하기 위한 라이브러리입니다. 그룹화된 쿼리를 작성 할 때 Querydsl을 사용하면 코드를 더 간결하고 가독성이 좋게 작성할 수 있습니다.

이번 예제에서는 예제 테이블인 orders를 사용하여 주문 데이터를 그룹화하는 쿼리를 작성해보겠습니다. orders 테이블에는 주문 번호(order_id), 고객 이름(customer_name), 주문 일자(order_date), 총 주문 금액(total_amount)의 컬럼이 존재합니다.

우리가 원하는 것은 고객별로 주문 금액의 합계를 구하고, 합계가 가장 큰 고객을 찾는 것입니다.

// querydsl의 Q클래스를 import 합니다.
import com.querydsl.core.Tuple;
import com.querydsl.jpa.impl.JPAQueryFactory;
import static com.querydsl.jpa.impl.JPAExpressions.*;

// JPAQueryFactory를 생성합니다.
JPAQueryFactory queryFactory = new JPAQueryFactory(entityManager);

// querydsl에서 사용할 Q클래스를 생성합니다.
QOrders orders = QOrders.orders;

// 주문 금액의 합계를 구하는 쿼리를 작성합니다.
List<Tuple> result = queryFactory
    .select(orders.customerName, orders.totalAmount.sum())
    .from(orders)
    .groupBy(orders.customerName)
    .fetch();

// 가장 주문 금액이 큰 고객을 찾습니다.
Tuple maxCustomer = queryFactory
    .select(orders.customerName, orders.totalAmount.sum())
    .from(orders)
    .groupBy(orders.customerName)
    .orderBy(orders.totalAmount.sum().desc())
    .fetchFirst();

// 결과를 출력합니다.
for (Tuple row : result) {
    System.out.println("Customer: " + row.get(orders.customerName) + ", Total Amount: " + row.get(orders.totalAmount.sum()));
}

System.out.println("Max Customer: " + maxCustomer.get(orders.customerName) + ", Total Amount: " + maxCustomer.get(orders.totalAmount.sum()));

위의 코드에서는 먼저 JPAQueryFactory 객체를 생성하고, QOrders 클래스를 사용하여 orders 테이블을 사용할 수 있도록 합니다.

그런 다음 쿼리를 작성하는데, select(), from(), groupBy(), orderBy() 등의 메소드를 사용하여 쿼리를 구성합니다. 마지막으로 fetch() 또는 fetchFirst() 메소드를 사용하여 결과를 가져옵니다.

그룹화된 결과를 출력하기 위해 for 루프를 사용하여 Tuple 객체에서 값을 가져와 출력합니다. 또한 가장 주문 금액이 큰 고객을 찾기 위해 orderBy() 메소드를 사용하여 내림차순 정렬하고 fetchFirst() 메소드를 사용하여 첫 번째 결과를 가져옵니다.

이제 Java Querydsl을 사용하여 그룹화된 쿼리를 작성하는 방법을 알게 되었습니다. Querydsl은 SQL 쿼리를 자바 코드로 작성할 수 있게 해주기 때문에 개발자들에게 유용한 도구입니다.