Java バックエンド開発では、データのクエリは非常に一般的な操作であり、JPA (Java Persistence API) の使用は非常に一般的な方法です。 JPA は、データベース内のデータを取得および操作するための柔軟で再利用可能な方法を提供します。ただし、動的クエリ (つまり、さまざまなパラメータに従ってクエリを調整する必要がある) の場合、従来の静的クエリ ステートメントや JPQL (Java Persistence Query Language) を使用するのは不便な場合があります。この場合、JPA Criteria API を使用すると、より便利で柔軟になります。
JPA Criteria API はオブジェクト指向のクエリ メソッドであり、クエリ条件を組み立ててコードを通じて結果を返すことによって実装されます。従来の静的クエリ ステートメントや JPQL と比較した場合、その主な利点の 1 つは、クエリ プロセス中にさまざまなクエリ条件を動的に結合でき、データ モデルの変更に適切に対応できることです。この記事では、JPA Criteria API を使用して動的クエリを実行する方法を紹介します。
まず、エンティティ クラスが必要です。ID、名前、年齢、性別などのフィールドを持つ User エンティティ クラスがあるとします。 、など。 JPA Criteria API を使用する前に、最初にこのエンティティ クラスを定義する必要があります。
@Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private Integer age; private Boolean gender; // 省略getter和setter方法 }
JPA Criteria API を使用する前に、まず CriteriaBuilder を取得する必要があります。 CriteriaBuilder は、さまざまな CriteriaQuery、Predicate、Expression を作成するために使用されるファクトリ クラスです。通常、CriteriaBuilder は EntityManager を通じて取得できます。
@PersistenceContext private EntityManager entityManager; public List<User> getUsers() { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); // ... 继续后续操作 }
CriteriaQuery はクエリ操作に使用され、クエリの条件と返される結果の種類を設定するために使用できます。クエリ条件を設定するときは、Predicate を使用して複数の制限を設定できます。Predicate は、クエリ条件を構築するための Criteria API の小さなツールです。
public List<User> getUsers(String name, Integer age, Boolean gender) { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<User> cq = cb.createQuery(User.class); Root<User> root = cq.from(User.class); List<Predicate> predicates = new ArrayList<>(); if (name != null) { Predicate namePredicate = cb.equal(root.get("name"), name); predicates.add(namePredicate); } if (age != null) { Predicate agePredicate = cb.greaterThanOrEqualTo(root.get("age"), age); predicates.add(agePredicate); } if (gender != null) { Predicate genderPredicate = cb.equal(root.get("gender"), gender); predicates.add(genderPredicate); } cq.where(predicates.toArray(new Predicate[0])); return entityManager.createQuery(cq).getResultList(); }
上記のコードは、CriteriaBuilder を使用して CriteriaQuery を作成する方法を示しています。まず、EntityManager を使用して CriteriaBuilder を取得します。次に、クエリ オブジェクト CriteriaQuery4c8e0c17c3bd7e0081bb17cc795e1984 cq を作成し、クエリの結果の種類が User であることを指定します。 Root4c8e0c17c3bd7e0081bb17cc795e1984 root を使用してクエリ条件を作成します。root は User オブジェクトを表します。次に、CriteriaBuilder を使用して Predicate オブジェクトを作成し、リストに追加します。最後に、条件を CriteriaQuery に設定し、クエリを実行して結果を返します。
式は、Criteria API のもう 1 つの非常に便利な概念です。これは、いくつかの複雑なデータ型を計算および比較するために使用できる演算式を表します。 Expression を使用すると、元のクエリ条件でより詳細なフィルタリングを実行できます。たとえば、between メソッドを使用して、年齢が特定の範囲内のユーザーをクエリできます。
public List<User> getUsersInRange(Integer minAge, Integer maxAge) { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<User> cq = cb.createQuery(User.class); Root<User> root = cq.from(User.class); Expression<Integer> ageExpression = root.get("age"); Predicate agePredicate = cb.between(ageExpression, minAge, maxAge); cq.where(agePredicate); return entityManager.createQuery(cq).getResultList(); }
上記のコードは、年齢が minAge と maxAge の間のユーザーをクエリします。ここでは、クエリする年齢フィールドが整数型であることを JPA Criteria API に理解させるために、Expressionc0f559cc8d56b43654fcbe4aa9df7b4a ageExpression を使用していることに注意してください。
シナリオによっては、複数のテーブルをクエリする必要があります。この時点で、複数テーブルのクエリに使用される中心的な概念である結合を使用する必要があります。 ID と userId という 2 つのフィールドを持つ Task エンティティ クラスがあるとします。UserId は、User エンティティ クラスの id フィールドに関連付けられています。
@Entity @Table(name = "task") public class Task { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Long userId; // 省略getter和setter方法 }
結合を通じて 2 つのエンティティ クラスを関連付け、指定したユーザーの下にあるすべてのタスクをクエリできます。
public List<Task> getUserTasks(Long userId) { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<Task> cq = cb.createQuery(Task.class); Root<Task> taskRoot = cq.from(Task.class); Join<Task, User> userJoin = taskRoot.join("user"); Predicate predicate = cb.equal(userJoin.get("id"), userId); cq.where(predicate); return entityManager.createQuery(cq).getResultList(); }
最後に、JPA Criteria API でページング クエリを実装する方法を紹介します。静的クエリと比較すると、ページング クエリも非常に一般的であり、比較的大量のデータを扱うシナリオでは特に重要です。 JPA Criteria API では、setFirstResult メソッドと setMaxResults メソッドを使用して、クエリの開始位置と返される結果の最大数を指定できます。
public List<User> getUsers(Integer pageNum, Integer pageSize) { CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<User> cq = cb.createQuery(User.class); Root<User> root = cq.from(User.class); int offset = (pageNum - 1) * pageSize; entityManager.createQuery(cq).setFirstResult(offset).setMaxResults(pageSize); return entityManager.createQuery(cq).getResultList(); }
上記のコードは、ページング クエリ条件を設定する方法を示しています。まず、pageNum と pageSize によってオフセットを計算し、開始位置を設定してから、setMaxResults によって返される結果の最大数を設定します。もちろん、実際のアプリケーションでは、他の方法でページング クエリを実行することもできます。
結論
JPA Criteria API は、動的クエリで適切なサポートを提供できる、非常に柔軟で強力なツールです。もちろん、実際のアプリケーションではパフォーマンスなどの問題も考慮する必要がありますが、これによりコードがより読みやすく、保守しやすく、スケーラブルになります。この記事が JPA を使用している読者、または JPA の使用を検討している読者の参考になれば幸いです。
以上がJava バックエンド開発: JPA 基準 API を使用した動的クエリの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。