問題:
Spring Data JPA リポジトリは、固定の事前定義されたクエリの作成をサポートしていますパラメータ。ただし、ユーザーが指定したフィールドに基づいて、任意の AND 句を含むクエリを動的に生成する必要があります。このアプローチは拡張性が低く、考えられるすべての組み合わせに対して明示的なクエリ定義が必要です。
ベスト アプローチ: Criteria API を使用した仕様
Spring Data は、Criteria API を活用して柔軟かつ動的に構築する仕様を提供します。クエリ。 JpaSpecificExecutor でリポジトリ インターフェイスを拡張することで、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)));
複雑な仕様:
複雑な仕様の場合、仕様でカスタム メソッドを定義できますclass:
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 Data JPA クエリを作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。