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:
- rode of blauwe kleur
EN
- 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:
- rode kleur en klasse D
OF
- 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.