Kombinieren von JPA- und / oder Kriterienprädikaten

1. Übersicht

Die JPA-Kriterien-API kann verwendet werden, um beim Abfragen von Datensätzen in einer Datenbank auf einfache Weise mehrere UND / ODER-Bedingungen hinzuzufügen. In diesem Tutorial werden wir ein kurzes Beispiel für JPA-Kriterienabfragen untersuchen, die mehrere UND / ODER-Prädikate kombinieren.

Wenn Sie mit Prädikaten nicht vertraut sind, empfehlen wir, zuerst die grundlegenden Abfragen zu JPA-Kriterien zu lesen.

2. Beispielanwendung

In unseren Beispielen betrachten wir eine Bestandsaufnahme von Artikelentitäten mit jeweils einer ID, einem Namen , einer Farbe und einer Note :

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

3. Kombinieren von zwei ODER- Prädikaten mit einem UND- Prädikat

Betrachten wir den Anwendungsfall, in dem wir Elemente mit beiden finden müssen:

  1. rote oder blaue Farbe

    UND

  2. Klasse A oder B.

Wir können dies leicht mit JPA Criteria APIs und () und / oder () zusammengesetzten Prädikaten tun .

Lassen Sie uns zunächst unsere Abfrage einrichten:

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

Jetzt müssen wir ein Prädikat erstellen , um Elemente mit einer blauen oder roten Farbe zu finden:

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

Als nächstes erstellen wir ein Prädikat , um Gegenstände der Klasse A oder B zu finden:

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

Schließlich definieren wir das AND- Prädikat dieser beiden, wenden die where () -Methode an und führen unsere Abfrage aus:

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

4. Kombinieren von zwei UND- Prädikaten mit einem ODER- Prädikat

Betrachten wir andererseits den Fall, in dem wir Elemente finden müssen, die entweder:

  1. rote Farbe und Klasse D.

    ODER

  2. blaue Farbe und Klasse B.

Die Logik ist ziemlich ähnlich, aber hier erstellen wir zuerst zwei UND- Prädikate und kombinieren sie dann mit einem ODER- Prädikat :

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. Schlussfolgerung

In diesem Tutorial haben wir die JPA-Kriterien-API verwendet, um Anwendungsfälle zu implementieren, in denen UND / ODER-Prädikate kombiniert werden mussten.

Wie üblich ist der vollständige Quellcode für dieses Tutorial auf GitHub beendet.