Combining JPA And/Or Criteria Predicates – 结合JPA和/或标准的谓词

最后修改: 2019年 3月 7日

中文/混合/英文(键盘快捷键:t)

1. Overview

1.概述

The JPA Criteria API can easily be used to add multiple AND/OR conditions when querying records in a database. In this tutorial, we’ll explore a quick example of JPA criteria queries that combine multiple AND/OR predicates.

在查询数据库中的记录时,JPA Criteria API可以很容易地用于添加多个AND/OR条件。在本教程中,我们将探讨一个快速的JPA标准查询的例子,结合多个AND/OR谓词。

If you’re not already familiar with predicates, we suggest reading about the basic JPA criteria queries first.

如果你还不熟悉谓词,我们建议先阅读基本的JPA标准查询

2. Sample Application

2.应用样本

For our examples, we’ll consider an inventory of Item entities, each having an id, name, color, and grade:

在我们的例子中,我们将考虑一个Item实体的库存,每个实体都有一个id,name, color, 和grade

@Entity
public class Item {

    @Id
    private Long id;
    private String color;
    private String grade;
    private String name;
    
    // standard getters and setters
}

3. Combining Two OR Predicates Using an AND Predicate

3.用and 谓词组合两个or 谓词

Let’s consider a scenario where we need to find items having both:

让我们考虑一种情况,即我们需要找到同时具有这两点的项目。

  1. red or blue color
    AND
  2. A or B grade

We can easily do this using JPA Criteria API’s and() and or() compound predicates.

我们可以轻松地做到这一点使用JPA Criteria API的and()or()复合谓词

To begin, we’ll set up our query:

首先,我们将设置我们的查询。

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Item> criteriaQuery = criteriaBuilder.createQuery(Item.class);
Root<Item> itemRoot = criteriaQuery.from(Item.class);

Now we’ll need to build a Predicate to find items having a blue or red color:

现在我们需要建立一个Predicate来寻找具有蓝色或红色的物品。

Predicate predicateForBlueColor
  = criteriaBuilder.equal(itemRoot.get("color"), "blue");
Predicate predicateForRedColor
  = criteriaBuilder.equal(itemRoot.get("color"), "red");
Predicate predicateForColor
  = criteriaBuilder.or(predicateForBlueColor, predicateForRedColor);

Next, we’ll build a Predicate to find items of grade A or B:

接下来,我们将建立一个Predicate来寻找A级或B级的项目。

Predicate predicateForGradeA
  = criteriaBuilder.equal(itemRoot.get("grade"), "A");
Predicate predicateForGradeB
  = criteriaBuilder.equal(itemRoot.get("grade"), "B");
Predicate predicateForGrade
  = criteriaBuilder.or(predicateForGradeA, predicateForGradeB);

Finally, we’ll define the AND Predicate of these two, apply the where() method, and execute our query:

最后,我们将定义这两个的AND Predicate,应用where()方法,并执行我们的查询。

Predicate finalPredicate
  = criteriaBuilder.and(predicateForColor, predicateForGrade);
criteriaQuery.where(finalPredicate);
List<Item> items = entityManager.createQuery(criteriaQuery).getResultList();

4. Combining Two AND Predicates Using an OR Predicate

4.用OR谓词组合两个AND 谓词

Conversely, let’s consider a scenario where we need to find items having either:

反过来说,让我们考虑一种情况,即我们需要找到具有以下两种情况的项目。

  1. red color and grade D
    OR
  2. blue color and grade B

The logic is quite similar, but here we create two AND Predicates first, and then combine them using an OR Predicate:

逻辑很相似,但在这里我们先创建两个AND Predicate,然后用OR Predicate将它们结合起来。

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Item> criteriaQuery = criteriaBuilder.createQuery(Item.class);
Root<Item> itemRoot = criteriaQuery.from(Item.class);

Predicate predicateForBlueColor
  = criteriaBuilder.equal(itemRoot.get("color"), "red");
Predicate predicateForGradeA
  = criteriaBuilder.equal(itemRoot.get("grade"), "D");
Predicate predicateForBlueColorAndGradeA
  = criteriaBuilder.and(predicateForBlueColor, predicateForGradeA);

Predicate predicateForRedColor
  = criteriaBuilder.equal(itemRoot.get("color"), "blue");
Predicate predicateForGradeB
  = criteriaBuilder.equal(itemRoot.get("grade"), "B");
Predicate predicateForRedColorAndGradeB
  = criteriaBuilder.and(predicateForRedColor, predicateForGradeB);

Predicate finalPredicate
  = criteriaBuilder
  .or(predicateForBlueColorAndGradeA, predicateForRedColorAndGradeB);
criteriaQuery.where(finalPredicate);
List<Item> items = entityManager.createQuery(criteriaQuery).getResultList();

5. Conclusion

5.结论

In this article, we used the JPA Criteria API to implement use cases where we needed to combine AND/OR predicates.

在这篇文章中,我们使用JPA Criteria API来实现我们需要结合AND/OR谓词的用例。

As usual, the complete source code for this article is available over on GitHub.

像往常一样,本文的完整源代码可在GitHub上获得