Combinatie van PPV- en / of criteriumpredikaten

1. Overzicht

De JPA Criteria API kan worden gebruikt om eenvoudig meerdere EN / OF-voorwaarden toe te voegen bij het opvragen van records in een database. In deze zelfstudie verkennen we een snel voorbeeld van JPA-criteriumquery's die meerdere EN / OF-predikaten combineren.

Als u niet bekend bent met predikaten, raden we u aan om eerst de algemene JPA-criteriaquery's te lezen.

2. Voorbeeldtoepassing

Voor onze voorbeelden kijken we naar een inventaris van Item entiteiten, elk met een ID kaart,naam, kleur, en rang:

@Entity openbare klasse Item {@Id privé Lange id; private String kleur; privé String-kwaliteit; private String naam; // standaard getters en setters}

3. Combineren van twee OF Predicaten met behulp van een EN Predikaat

Laten we eens kijken naar de use case waarin we items moeten vinden die beide hebben:

  1. rode of blauwe kleur

    EN

  2. A- of B-klasse

We kunnen dit gemakkelijk doen met behulp van JPA Criteria API's en() en of() samengestelde predikaten.

Laten we om te beginnen onze vraag instellen:

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

Nu moeten we een Predikaat items zoeken met een blauwe of rode kleur:

Predicaat predicateForBlueColor = criteriaBuilder.equal (itemRoot.get ("kleur"), "blauw"); Predicaat predicateForRedColor = criteriaBuilder.equal (itemRoot.get ("color"), "red"); Predicaat predicateForColor = criteriaBuilder.or (predicateForBlueColor, predicateForRedColor);

Laten we vervolgens een Predikaat om items van klasse A of B te vinden:

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

Ten slotte definiëren we de AND Predikaat van deze twee, pas de waar() methode, en voer onze zoekopdracht uit:

Predicaat finalPredicate = criteriaBuilder.and (predicateForColor, predicateForGrade); criteriaQuery.where (finalPredicate); Lijstitems = entityManager.createQuery (criteriaQuery) .getResultList ();

4. Combineren van twee EN Predicaten met behulp van een OF Predikaat

Aan de andere kant, laten we eens kijken naar het geval waarin we items moeten vinden met:

  1. rode kleur en klasse D

    OF

  2. blauwe kleur en klasse B

De logica is vrij gelijkaardig, maar hier maken we twee AND Predikaats en combineer ze vervolgens met een OF Predikaat:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder (); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery (Item.class); Root itemRoot = criteriaQuery.from (Item.class); Predicaat predicateForBlueColor = criteriaBuilder.equal (itemRoot.get ("kleur"), "rood"); Predicaat predicateForGradeA = criteriaBuilder.equal (itemRoot.get ("grade"), "D"); Predicaat predicateForBlueColorAndGradeA = criteriaBuilder.and (predicateForBlueColor, predicateForGradeA); Predicaat predicateForRedColor = criteriaBuilder.equal (itemRoot.get ("kleur"), "blauw"); Predicaat predicateForGradeB = criteriaBuilder.equal (itemRoot.get ("grade"), "B"); Predicaat predicateForRedColorAndGradeB = criteriaBuilder.and (predicateForRedColor, predicateForGradeB); Predicaat finalPredicate = criteriaBuilder .or (predicateForBlueColorAndGradeA, predicateForRedColorAndGradeB); criteriaQuery.where (finalPredicate); Lijstitems = entityManager.createQuery (criteriaQuery) .getResultList ();

5. Conclusie

In deze tutorial hebben we de JPA Criteria API gebruikt om gebruiksscenario's te implementeren waarin we EN / OF-predikaten moesten combineren.

Zoals gewoonlijk is de volledige broncode die voor deze tutorial wordt gebruikt, op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found