Kombinere JPA og / eller kriterier predikater
1. Oversikt
JPA Criteria API kan brukes til å enkelt legge til flere AND / OR-forhold når du spør om poster i en database. I denne opplæringen vil vi utforske et raskt eksempel på JPA-kriteriespørsmål som kombinerer flere AND / OR-predikater.
Hvis du ikke er kjent med predikater, foreslår vi at du først leser om de grunnleggende JPA-kriteriene.
2. Eksempel på søknad
For eksemplene vil vi vurdere en oversikt over Punkt enheter, som hver har en id,Navn, farge, og karakter:
@Entity public class Element {@Id privat Lang id; private String farge; privat streng karakter; privat strengnavn; // standard getters og setters}
3. Kombinere to ELLER Predikater ved hjelp av en OG Predikere
La oss vurdere brukssaken der vi trenger å finne gjenstander som har begge:
- rød eller blå farge
OG
- A- eller B-karakter
Vi kan enkelt gjøre dette ved hjelp av JPA Criteria API-er og() og eller() sammensatte predikater.
For å begynne, la oss sette opp spørringen:
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder (); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery (Item.class); Root itemRoot = criteriaQuery.from (Item.class);
Nå må vi bygge en Predikere for å finne gjenstander som har en blå eller en rød farge:
Predikere predicateForBlueColor = criteriaBuilder.equal (itemRoot.get ("farge"), "blå"); Predikere predicateForRedColor = criteriaBuilder.equal (itemRoot.get ("farge"), "rød"); Predicate predicateForColor = criteriaBuilder.or (predicateForBlueColor, predicateForRedColor);
La oss deretter bygge en Predikere for å finne gjenstander av klasse A eller B:
Predikere predicateForGradeA = criteriaBuilder.equal (itemRoot.get ("grade"), "A"); Predikere predicateForGradeB = criteriaBuilder.equal (itemRoot.get ("grade"), "B"); Predicate predicateForGrade = criteriaBuilder.or (predicateForGradeA, predicateForGradeB);
Til slutt definerer vi AND Predikere av disse to, bruk hvor() metode, og utfør spørringen vår:
Predicate finalPredicate = criteriaBuilder.and (predicateForColor, predicateForGrade); criteriaQuery.where (finalPredicate); Listeelementer = entityManager.createQuery (criteriaQuery) .getResultList ();
4. Kombinere to OG Predikater ved hjelp av en ELLER Predikere
På den annen side, la oss vurdere tilfellet der vi trenger å finne gjenstander som har:
- rød farge og klasse D
ELLER
- blå farge og klasse B
Logikken er ganske lik, men her lager vi to OG Predikeres først og deretter kombinere dem ved hjelp av en OR Predikere:
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder (); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery (Item.class); Root itemRoot = criteriaQuery.from (Item.class); Predikere predicateForBlueColor = criteriaBuilder.equal (itemRoot.get ("farge"), "rød"); Predikere predicateForGradeA = criteriaBuilder.equal (itemRoot.get ("grade"), "D"); Predikat predicateForBlueColorAndGradeA = criteriaBuilder.and (predicateForBlueColor, predicateForGradeA); Predikere predicateForRedColor = criteriaBuilder.equal (itemRoot.get ("farge"), "blå"); Predikere predicateForGradeB = criteriaBuilder.equal (itemRoot.get ("grade"), "B"); Predicate predicateForRedColorAndGradeB = criteriaBuilder.and (predicateForRedColor, predicateForGradeB); Predicate finalPredicate = criteriaBuilder .or (predicateForBlueColorAndGradeA, predicateForRedColorAndGradeB); criteriaQuery.where (finalPredicate); Listeelementer = entityManager.createQuery (criteriaQuery) .getResultList ();
5. Konklusjon
I denne opplæringen brukte vi JPA Criteria API for å implementere brukstilfeller der vi trengte å kombinere AND / ELLER predikater.
Som vanlig er den fullstendige kildekoden som brukes til denne opplæringen, over på GitHub.