Spring/Spring Data JPA

[Spring Data JPA] 3-4. Specifications

noahkim_ 2024. 8. 3. 10:26

1. Specification

  • 도메인 객체에 대한 조건을 정의
public interface Specification<T> {
    Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder);
}

 

 Predicate
  • 각 조건을 표현하는 객체 (where 절)

 

CriteriaBuilder
  • 다양한 조건을 빌드할 수 있는 객체

 

Definition

public class CustomerSpecs {

    // 특정 날짜 이전에 생성된 고객을 찾는 Specification
    public static Specification<Customer> isLongTermCustomer() {
        return (root, query, builder) -> {
            LocalDate date = LocalDate.now().minusYears(2);
            return builder.lessThan(root.get(Customer_.createdAt), date);
        };
    }

    // 특정 금액 이상의 매출을 가진 고객을 찾는 Specification
    public static Specification<Customer> hasSalesOfMoreThan(MonetaryAmount value) {
        return (root, query, builder) -> {
            // 쿼리 작성
        };
    }
}

 

 

2. JpaSpecificationExecutor

  • Specification을 사용하여 쿼리를 실행할 수 있는 메서드 제공
  • 동적 쿼리를 쉽게 작성 가능
public interface CustomerRepository extends CrudRepository<Customer, Long>, JpaSpecificationExecutor<Customer> {
    // 커스텀 쿼리 메서드 정의
}

 

Use

List<Customer> customers = customerRepository.findAll(CustomerSpecs.isLongTermCustomer());
MonetaryAmount amount = new MonetaryAmount(200.0, Currencies.DOLLAR);
List<Customer> customers = customerRepository.findAll(
    CustomerSpecs.isLongTermCustomer().or(CustomerSpecs.hasSalesOfMoreThan(amount))
);

 

 

 출처