public class OrdererSpec implements Specification<Order> {
private String ordererId;
public Predicate toPredicate(Root<Order> root, CriteriaBuilder cb) {
return cb.equal(root.get(Order_.orderer)
.get(Orderer_.memberId).get(MemberId_.id),
ordererId);
}
}
클라이언트는 원하는 스펙을 생성하고 리포지터리에 전달해서 검색하면 된다.
Specification<Order> ordererSpec = new OrdererSpec("madvirus");
List<Order> orders = orderRepository.findAll(ordererSpec);
Order_.orderer 코드가 있는데 Order_ 클래스는 JPA의 정적 메타 모델을 정의한 코드이다. 정적 메타 모델은 @StaticMetamodel 애노테이션을 이용해서 관련 모델을 지정한다. 정적 메타 모델 클래스는 대상 모델의 각 프로퍼티와 동일한 이름을 갖는 정적 필드를 정의한다.
Specification 구현 클래스를 개별적으로 만들지 않고 별도 클래스에 스펙 생성 기능을 모아도 된다.
public class OrderSpecs {
public static Specification<Order> orderer(String ordererId) {
return (root, cb) -> cb.equal(
root.get(Order_.orderer).get(Orderer_.memberId).get(MemberId_.id),
ordererId);
}
public static Specification<Order> between(Date from, Date to) {
return (root, cb) -> cb.between(root.get(Order_.orderDate), from, to);
}
}