: 스프링 데이터 JPA가 제공하는 스펙 인터페이스는 스펙을 조합할 수 있는 두 가지 메서드를 제공하고 있다. 이는 and와 or이다.
public interface Specification<T> extends Serializable {
...
default Specification<T> and(@Nullable Specification<T> other) { ... }
default Specification<T> or(@Nullable Specification<T> other) { ... }
@Nullable
Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder);
}
Java
복사
: and()와 or() 메서드는 기본 구현을 가진 디폴트 메서드로 and() 메서드는 두 스펙을 모두 충족하는 조건을 표현하는 스펙을 생성하고 or() 메서드는 두 스펙 중 하나 이상 충족하는 조건을 표현하는 스펙을 생성한다.
//사용예시
Specification<OrderSummary> spec = OrderSummarySpecs.ordererId("user1")
.and(OrderSummarySpecs.orderDateBetween(from, to));
Java
복사
: 스펙 인터페이스는 not() 메서드도 제공하는데, not()은 정적 메서드로 조건을 반대로 적용할 때 사용한다.
Specification<OrderSummary> spec = Specification.not(OrderSummarySpecs.ordererld("user1"));
Java
복사
: nullable한 스펙 객체와 다른 스펙을 조합해야할 때가 있는데, 이 경우에는 null 여부를 판단해서 NullPointerException이 발생하는 것을 방지해야 한다, 그러나 이는 매번 검사해주어야하므로 귀찮은 과정인데, where() 메서드를 사용하면 이런 귀찮음을 줄일 수 있다!
Specification<OrderSummary> spec = Specification.where(createNull.ableSpec()).and(createOtherSpec());
Java
복사
: where() 메서드는 스펙 인터페이스의 정적 메서드로 null을 전달하면 아무 조건도 생성하지 않는 스펙 객체를 리턴하고 null이 아니면 인자로 받은 스펙 객체를 그대로 리턴한다.