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:

  1. rød eller blå farge

    OG

  2. 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:

  1. rød farge og klasse D

    ELLER

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


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