Combinazione di predicati JPA e / o criteri

1. Panoramica

L'API dei criteri JPA può essere utilizzata per aggiungere facilmente più condizioni AND / OR quando si interrogano i record in un database. In questo tutorial, esploreremo un rapido esempio di query con criteri JPA che combinano più predicati AND / OR.

Se non hai familiarità con i predicati, ti suggeriamo di leggere prima le query sui criteri JPA di base.

2. Applicazione di esempio

Per i nostri esempi, prenderemo in considerazione un inventario di entità Item , ciascuna con un ID, un nome , un colore e un grado :

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

3. Combinazione di due predicati OR utilizzando un predicato AND

Consideriamo il caso d'uso in cui dobbiamo trovare elementi che abbiano entrambi:

  1. colore rosso o blu

    E

  2. Grado A o B.

Possiamo farlo facilmente utilizzando i predicati composti e () e or () dell'API dei criteri JPA .

Per iniziare, impostiamo la nostra query:

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

Ora, dovremo creare un predicato per trovare elementi di colore blu o rosso:

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

Successivamente, creiamo un predicato per trovare elementi di grado A o B:

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

Infine, definiamo il predicato AND di questi due, applichiamo il metodo where () ed eseguiamo la nostra query:

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

4. Combinazione di due predicati AND utilizzando un predicato OR

D'altra parte, consideriamo il caso in cui dobbiamo trovare elementi che abbiano:

  1. colore rosso e grado D

    O

  2. colore blu e grado B

La logica è abbastanza simile, ma qui creiamo prima due predicati AND e poi li combiniamo utilizzando un predicato 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. conclusione

In questo tutorial, abbiamo utilizzato l'API dei criteri JPA per implementare casi d'uso in cui era necessario combinare predicati AND / OR.

Come al solito, il codice sorgente completo utilizzato per questo tutorial è finito su GitHub.