Combinaison de prédicats JPA et / ou de critères

1. Vue d'ensemble

L'API JPA Criteria peut être utilisée pour ajouter facilement plusieurs conditions AND / OR lors de l'interrogation d'enregistrements dans une base de données. Dans ce didacticiel, nous allons explorer un exemple rapide de requêtes de critères JPA qui combinent plusieurs prédicats AND / OR.

Si vous n'êtes pas familier avec les prédicats, nous vous suggérons de lire d'abord les requêtes de critères JPA de base.

2. Exemple d'application

Pour nos exemples, nous allons considérer un inventaire des entités Item , chacune ayant un identifiant, un nom , une couleur et une note :

@Entity public class Item { @Id private Long id; private String color; private String grade; private String name; // standard getters and setters }

3. Combinaison de deux prédicats OR à l' aide d'un prédicat AND

Considérons le cas d'utilisation où nous devons trouver des éléments ayant les deux:

  1. couleur rouge ou bleue

    ET

  2. Grade A ou B

Nous pouvons facilement le faire en utilisant les prédicats composés des API de critères JPA et () et ou () .

Pour commencer, configurons notre requête:

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

Maintenant, nous devons créer un prédicat pour trouver des éléments de couleur bleue ou rouge:

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

Ensuite, construisons un prédicat pour trouver des éléments de grade A ou B:

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

Enfin, nous définissons le prédicat AND de ces deux, appliquons la méthode where () et exécutons notre requête:

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

4. Combinaison de deux prédicats AND à l' aide d'un prédicat OR

D'un autre côté, considérons le cas où nous devons trouver des éléments ayant soit:

  1. couleur rouge et grade D

    OU

  2. couleur bleue et grade B

La logique est assez similaire, mais ici, nous créons d'abord deux prédicats AND , puis les combinons à l'aide d'un prédicat OR :

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Item.class); Root 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 items = entityManager.createQuery(criteriaQuery).getResultList();

5. Conclusion

Dans ce didacticiel, nous avons utilisé l'API JPA Criteria pour implémenter des cas d'utilisation dans lesquels nous devions combiner des prédicats AND / OR.

Comme d'habitude, le code source complet utilisé pour ce tutoriel est terminé sur GitHub.