Kombination af JPA og / eller kriterier forudsigelser

1. Oversigt

JPA Criteria API kan bruges til nemt at tilføje flere AND / ELLER betingelser, når du spørger poster i en database. I denne vejledning undersøger vi et hurtigt eksempel på JPA-kriterieforespørgsler, der kombinerer flere AND / ELLER prædikater.

Hvis du ikke er fortrolig med prædikater, foreslår vi, at du først læser om de grundlæggende JPA-kriterieforespørgsler.

2. Eksempel på anvendelse

For vores eksempler overvejer vi en oversigt over Vare enheder, der hver har en id,navn, farveog karakter:

@Entity public class Element {@Id privat Lang id; private String farve; privat streng klasse; privat strengnavn; // standard getters og setter}

3. Kombination af to ELLER Predikater ved hjælp af en OG Prædikat

Lad os overveje brugen af ​​tilfælde, hvor vi skal finde emner, der har begge dele:

  1. rød eller blå farve

    OG

  2. A- eller B-klasse

Vi kan let gøre dette ved hjælp af JPA Criteria API'er og() og eller() sammensatte prædikater.

Lad os starte med at oprette vores forespørgsel:

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

Nu skal vi bygge en Prædikat for at finde genstande med en blå eller en rød farve:

Predikat predicateForBlueColor = criteriaBuilder.equal (itemRoot.get ("farve"), "blå"); Predikat predicateForRedColor = criteriaBuilder.equal (itemRoot.get ("farve"), "rød"); Predikat predicateForColor = criteriaBuilder.or (predicateForBlueColor, predicateForRedColor);

Lad os derefter bygge en Prædikat at finde emner af 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);

Endelig definerer vi AND Prædikat af disse to skal du anvende hvor() metode, og udfør vores forespørgsel:

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

4. Kombination af to OG Predikater ved hjælp af en ELLER Prædikat

Lad os på den anden side overveje det tilfælde, hvor vi har brug for at finde emner, der har enten:

  1. rød farve og klasse D

    ELLER

  2. blå farve og klasse B

Logikken er ret ens, men her opretter vi to OG Prædikats først og derefter kombinere dem ved hjælp af en ELLER Prædikat:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder (); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery (Item.class); Root itemRoot = criteriaQuery.from (Item.class); Predikat predicateForBlueColor = criteriaBuilder.equal (itemRoot.get ("farve"), "rød"); Predikere predicateForGradeA = criteriaBuilder.equal (itemRoot.get ("grade"), "D"); Predikat predicateForBlueColorAndGradeA = criteriaBuilder.and (predicateForBlueColor, predicateForGradeA); Predikat predicateForRedColor = criteriaBuilder.equal (itemRoot.get ("farve"), "blå"); Predikere predicateForGradeB = criteriaBuilder.equal (itemRoot.get ("grade"), "B"); Predikat predicateForRedColorAndGradeB = criteriaBuilder.and (predicateForRedColor, predicateForGradeB); Predicate finalPredicate = criteriaBuilder .or (predicateForBlueColorAndGradeA, predicateForRedColorAndGradeB); criteriaQuery.where (finalPredicate); Listeelementer = entityManager.createQuery (criteriaQuery) .getResultList ();

5. Konklusion

I denne vejledning brugte vi JPA Criteria API til at implementere brugssager, hvor vi havde brug for at kombinere AND / ELLER prædikater.

Som sædvanlig er den komplette kildekode, der bruges til denne tutorial, forbi på GitHub.