具有可配置AND 子句的動態Spring Data JPA 儲存庫查詢
在Spring Data JPA 中,可以根據使用者提供的輸入建立客製化查詢具有挑戰性,尤其是在處理可選搜尋欄位時。本文探討了使用規範的最佳解決方案。
現有方法的限制
Spring Data 的範例查詢(QBE) 方法和Querydsl 在處理選用欄位方面都有限制,需要對各種欄位組合的多個查詢進行手動編碼。隨著搜尋欄位數量的增加,這變得不切實際。
解決方案:使用規範
Spring Data 規範提供了一種可擴展的方式來動態建構條件查詢。它們允許創建可重複使用的條件表達式,這些表達式可以組合起來形成複雜的查詢。
要利用規範,請使用 JpaSpecificationExecutor 擴充儲存庫介面。
public interface CustomerRepository extends SimpleJpaRepository<T, ID>, JpaSpecificationExecutor { }
規範介面定義了 toPredicate 方法建立一個謂詞以套用於 CriteriaBuilder 來建立查詢。
public interface Specification<T> { Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder); }
例如,假設我們有以下用例:使用 isLongTermCustomer 和 hasSalesOfMoreThan 等選用條件進行客戶搜尋。我們可以為這些標準定義規範,並使用 and 或 or 來組合它們。
public class CustomerSpecs { public static Specification<Customer> isLongTermCustomer() {...} public static Specification<Customer> hasSalesOfMoreThan(MonetaryAmount value) {...} } List customers = customerRepository.findAll(isLongTermCustomer()); List customers = customerRepository.findAll(where(isLongTermCustomer()).or(hasSalesOfMoreThan(amount)));
複雜規範
規範可以連結和組合以創建複雜的標準。例如,以下規範根據搜尋條件尋找正在進行的工作,包括功能、史詩、群組、日期和團隊。
public class WorkInProgressSpecification { public static Specification<WorkInProgress> findByCriteria(final SearchCriteria searchCriteria) {...} }
結論
規格提供強大且可擴展的解決方案,用於建立具有可選欄位的動態 Spring Data JPA 查詢。它們支援靈活的條件組合,並允許創建可重複使用的謂詞表達式。
以上是Spring Data JPA 規格如何使用可設定的 AND 子句解決動態查詢?的詳細內容。更多資訊請關注PHP中文網其他相關文章!