
Baeldung Pro comes with both absolutely No-Ads as well as finally with Dark Mode, for a clean learning experience:
Once the early-adopter seats are all used, the price will go up and stay at $33/year.
Last updated: May 15, 2025
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.
If you’re not already familiar with predicates, we suggest reading about the basic JPA criteria queries first.
For our examples, we’ll consider an inventory of Item entities, each having an id, name, color, and grade:
@Entity
public class Item {
@Id
private Long id;
private String color;
private String grade;
private String name;
// standard getters and setters
}
Let’s consider a scenario where we need to find items having both:
We can easily do this using JPA Criteria API’s and() and or() compound predicates.
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 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 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:
Predicate finalPredicate
= criteriaBuilder.and(predicateForColor, predicateForGrade);
criteriaQuery.where(finalPredicate);
List<Item> items = entityManager.createQuery(criteriaQuery).getResultList();
Conversely, let’s consider a scenario where we need to find items having either:
The logic is quite similar, but here we create two AND Predicates first, and then combine them using an 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();
In this article, we used the JPA Criteria API to implement use cases where we needed to combine AND/OR predicates.