문제:
Spring Data JPA 저장소는 미리 정의된 고정된 쿼리 생성을 지원합니다. 매개변수. 그러나 사용자가 제공한 필드를 기반으로 임의의 AND 절을 사용하여 쿼리를 동적으로 생성해야 한다는 요구 사항이 있습니다. 이 접근 방식은 확장성이 낮고 가능한 모든 조합에 대해 명시적인 쿼리 정의가 필요합니다.
최상의 접근 방식: 기준 API를 사용한 사양
Spring Data는 유연하고 동적인 구축을 위해 Criteria API를 활용하는 사양을 제공합니다. 쿼리. JpaSpecificationExecutor로 저장소 인터페이스를 확장하면 findAll을 포함한 다양한 메소드를 사용하여 사양을 실행할 수 있습니다.
사양 인터페이스:
public interface Specification<T> { Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder); }
예 구현:
public static Specification<Customer> isLongTermCustomer() { return new Specification<Customer>() { public Predicate toPredicate(Root<Customer> root, CriteriaQuery<?> query, CriteriaBuilder builder) { LocalDate date = new LocalDate().minusYears(2); return builder.lessThan(root.get('dateField'), date); } }; } public static Specification<Customer> hasSalesOfMoreThan(MontaryAmount value) { return new Specification<Customer>() { public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder) { // build query here } }; }
사용 예:
List customers = customerRepository.findAll(isLongTermCustomer()); MonetaryAmount amount = new MonetaryAmount(200.0, Currencies.DOLLAR); List<Customer> customers = customerRepository.findAll( where(isLongTermCustomer()).or(hasSalesOfMoreThan(amount)));
복잡한 사양:
복잡한 사양의 경우 , 사양에 맞춤 메서드를 정의할 수 있습니다. 클래스:
public static Specification<WorkInProgress> findByCriteria(final SearchCriteria searchCriteria) { return new Specification<WorkInProgress>() { public Predicate toPredicate(Root<WorkInProgress> root, CriteriaQuery<?> query, CriteriaBuilder cb) { List<Predicate> predicates = new ArrayList<Predicate>(); // Add predicates based on search criteria return cb.and(predicates.toArray(new Predicate[] {})); } }; }
결론:
명시적인 쿼리 정의 없이도 동적 쿼리 생성이 가능한 사양입니다. 이 접근 방식은 확장 가능하며 유연하고 사용자 정의 가능한 쿼리 생성을 단순화합니다. 자세한 내용은 JPA 저장소 문서를 참조하세요.
위 내용은 임의의 AND 절을 사용하여 동적 Spring 데이터 JPA 쿼리를 어떻게 만들 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!