>Java >java지도 시간 >임의의 AND 절을 사용하여 동적 Spring 데이터 JPA 쿼리를 어떻게 만들 수 있나요?

임의의 AND 절을 사용하여 동적 Spring 데이터 JPA 쿼리를 어떻게 만들 수 있나요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-10 13:42:14833검색

How Can I Create Dynamic Spring Data JPA Queries with Arbitrary AND Clauses?

임의 AND 절을 사용한 동적 Spring Data JPA 저장소 쿼리

문제:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.