관리 메뉴

Life goes slowly...

[JPA] JPA - ExpressionUtils / 서브쿼리 본문

프로그래밍/Java

[JPA] JPA - ExpressionUtils / 서브쿼리

빨강소 2026. 1. 30. 09:36
728x90
반응형

1. ExpressionUtils란?

ExpressionUtils는 Expression(표현식)을 조합하거나
서브쿼리를 select 절에 포함시킬 때 사용하는 유틸입니다.

주 용도

  • 서브쿼리 → 컬럼처럼 사용
  • alias 지정
  • 산술 연산용 Expression 구성

2. 서브쿼리 기본 (JPAExpressions)

queryFactory
    .selectFrom(member)
    .where(member.age.gt(
        select(member.age.avg())
            .from(member)
    ))
    .fetch();

 


3. Select 절에 서브쿼리 넣기 (ExpressionUtils.as)

queryFactory
    .select(
        member.username,
        ExpressionUtils.as(
            select(member.age.avg())
                .from(member),
            "avgAge"
        )
    )
    .from(member)
    .fetch();
    
*ExpressionUtils.as(Expression, alias) - alias는 DTO 매핑용

 


4. 집계 함수 총정리


5. 올바른 산술 연산 방법 (NumberExpression)

//Select 절에서 직접 계산
NumberExpression<Long> expr =
    order.price.sum().subtract(refund.price.sum());

//서브쿼리 + NumberTemplate
NumberExpression<Long> diff =
    Expressions.numberTemplate(
        Long.class,
        "({0}) - ({1})",
        select(order.price.sum()).from(order),
        select(refund.price.sum()).from(refund)
    );
    

.select(diff)
.from(member)
.fetch();

--서브쿼리 간 뺄셈은 Template 필수
728x90
반응형
Comments