반응형
Spring Data JPA는 org.springframework.data.jpa.domain.Specification 클래스로 다양한 검색조건을을 조립해서 새로운 검색조건을 만들 수 있다.
본래에 JpaRepository 상속받을때 JpaSpecificationExecutor을 상속받으면 된다.
public interface JpaSpecificationExecutor<T> {
T findOn(Specification<T> spec);
List<T> findAll(Specification<T> spec);
Page<T> findAll(Specification<T> spec, Pageable pagaable);
List<T> findAll(Specification<T> spec, Sort sort);
long count(Specification<T> spec);
}
public interface OrderRepository extends JpaRepository<Order, Long>, JpaSpecificationExecutor<Order> {
...
}
public List<Order> findOrders(String name) {
List<Order> result = orderRepository.findAll(where(memberName(name)).and(isOrderStatus()));
return result;
}
public class OrderSpec {
public static Specification<Order> memberName(final String memberName) {
return new Specification<Order>() {
@Override
public Predicate toPredicate(Root<Order> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
if (StringUtils.isBlank(memberName)) return null;
Join<Order, Member> m = root.join("member", JoinType.INNER); // 회원과 JOIN
return criteriaBuilder.equal(m.get("name", memberName));
}
}
}
public static Specification<Order> isOrderStatus() {
return new Specification<Order>() {
@Override
public Predicate toPredicate(Root<Order> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
return criteriaBuilder.equal(root.get("status", OrderStatus.ORDER));
}
}
}
}
Specifications는 조건식들을 조립할 수 있도록 도와주는 클래스인데 where, and, or, not 메소드를 제공한다.
이 기능을 사용할때 static 함수를 사용하면 더욱 읽기 쉬운 코드가 된다.
나는 검색을 사용하는 목록 조회 시에는 거의 QueryDSL을 사용하므로 해당 기능은 별로 사용한 적이 없다...
반응형
'JPA' 카테고리의 다른 글
엔티티가 준영속 상태에서 생기는 문제점 (0) | 2022.01.20 |
---|---|
트랜잭션 범위의 영속성 컨텍스트 (0) | 2022.01.20 |
Spring Data JPA 소개 (0) | 2022.01.18 |
벌크 연산, JPQL과 영속성 콘텍스트, Flush Mode (1) | 2022.01.17 |
JPA 스토어드 프로시저(Stored Procedure) (1) | 2022.01.17 |