オプションのフィルター基準を使用した動的 Spring データ JPA リポジトリ クエリ
問題:
春Data JPA、オプションのフィルター条件を使用した動的クエリの生成は、フィールドの数が増えると困難になります
ベスト アプローチ: 仕様と基準 API
Spring Data JPA は、仕様インターフェイスとこの問題に対処するための Criteria API。仕様を使用すると、動的に組み合わせてクエリの構築に使用できる述語をプログラムで作成できます。
仕様の実装
仕様を使用するには、JpaSpecificExecutor でリポジトリ インターフェイスを拡張します。インターフェース:
public interface EmployeeRepository extends JpaRepository<Employee, Integer>, JpaSpecificationExecutor<Employee> {}
の作成仕様
仕様インターフェイスを実装する Java クラスを作成し、各フィルター基準の述語ロジックを定義します。たとえば、EmployeeNumber フィールドの仕様を作成するには:
public class EmployeeNumberSpecification implements Specification<Employee> { private String employeeNumber; public EmployeeNumberSpecification(String employeeNumber) { this.employeeNumber = employeeNumber; } @Override public Predicate toPredicate(Root<Employee> root, CriteriaQuery<?> query, CriteriaBuilder builder) { if (employeeNumber == null || employeeNumber.isEmpty()) { return builder.disjunction(); // Allow any value } return builder.like(root.get("employeeNumber"), "%" + employeeNumber + "%"); } }
仕様の結合
論理演算子 (例: and、or、ではありません)、より複雑な検索条件を作成します。たとえば、特定の従業員番号と職業を持つ従業員を検索するには:
Specification<Employee> employeeNumberSpec = new EmployeeNumberSpecification("10"); Specification<Employee> professionSpec = new ProfessionSpecification("IT"); Specification<Employee> combinedSpec = Specification.where(employeeNumberSpec).and(professionSpec);
クエリの実行
仕様は、JPA の findAll およびその他のメソッドで使用できます。動的クエリを実行するためのリポジトリ:
List<Employee> employees = employeeRepository.findAll(combinedSpec);
の利点仕様:
以上がオプションのフィルター基準を使用して動的 Spring Data JPA クエリを構築するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。