Kombiniranje predikata JPA i / ili kriterija

1. Pregled

API JPA kriterija može se koristiti za jednostavno dodavanje višestrukih uvjeta I / ILI prilikom upita o zapisima u bazi podataka. U ovom ćemo uputstvu istražiti brzi primjer upita JPA kriterija koji kombiniraju više predikata I / ILI.

Ako niste upoznati s predikatima, predlažemo da prvo pročitate osnovne upite o kriterijima JPA.

2. Primjer uzorka

Za naše primjere razmotrit ćemo popis Artikal entiteti, od kojih svaki ima iskaznica,Ime, boja, i razred:

@ Entitet javne klase Predmet {@Id private Long id; privatna boja niza; privatna ocjena niza; privatni naziv niza; // standardni geteri i postavljači}

3. Kombiniranje dva ILI Predikati pomoću I Predikat

Razmotrimo slučaj korištenja u kojem trebamo pronaći predmete koji imaju oboje:

  1. crvena ili plava boja

    I

  2. A ili B ocjena

To možemo lako učiniti pomoću API-ja JPA kriterija i() i ili() složeni predikati.

Za početak postavimo naš upit:

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

Sada ćemo morati izraditi a Predikat da biste pronašli predmete koji imaju plavu ili crvenu boju:

Predikat predikatForBlueColor = criteriaBuilder.equal (itemRoot.get ("boja"), "plava"); Predikat predikatForRedColor = criteriaBuilder.equal (itemRoot.get ("boja"), "crvena"); Predikat predikatForColor = criteriaBuilder.or (predikatForBlueColor, predikatForRedColor);

Dalje, napravimo a Predikat kako biste pronašli predmete razreda A ili B:

Predikat predikatForGradeA = criteriaBuilder.equal (itemRoot.get ("ocjena"), "A"); Predikat predikatForGradeB = kriterijiBuilder.equal (itemRoot.get ("ocjena"), "B"); Predikat predikatForGrade = criteriaBuilder.or (predikatForGradeA, predikatForGradeB);

Na kraju definiramo I Predikat od ove dvije, primijenite gdje() metodu i izvršite naš upit:

Predikat finalPredicate = criteriaBuilder.and (predikatForColor, predikatForGrade); kriterijiQuery.where (finalPredicate); Stavke na popisu = entityManager.createQuery (kriterijQuery) .getResultList ();

4. Kombiniranje dva I Predikati pomoću ILI Predikat

S druge strane, razmotrimo slučaj kada trebamo pronaći predmete koji imaju bilo što:

  1. crvena boja i ocjena D

    ILI

  2. plava boja i ocjena B

Logika je prilično slična, ali ovdje stvaramo dva I Predikats, a zatim ih kombinirajte pomoću ILI Predikat:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder (); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery (Item.class); Korijenski itemRoot = kriterijiQuery.from (Item.class); Predikat predikatForBlueColor = criteriaBuilder.equal (itemRoot.get ("boja"), "crvena"); Predikat predikatForGradeA = kriterijiBuilder.equal (itemRoot.get ("ocjena"), "D"); Predikat predikatForBlueColorAndGradeA = criteriaBuilder.and (predikatForBlueColor, predikatForGradeA); Predikat predikatForRedColor = criteriaBuilder.equal (itemRoot.get ("boja"), "plava"); Predikat predikatForGradeB = kriterijiBuilder.equal (itemRoot.get ("ocjena"), "B"); Predikat predikatForRedColorAndGradeB = criteriaBuilder.and (predikatForRedColor, predikatForGradeB); Predikat finalPredicate = kriterijiBuilder .ili (predikatForBlueColorAndGradeA, predikatForRedColorAndGradeB); kriterijiQuery.where (finalPredicate); Stavke na popisu = entityManager.createQuery (kriterijQuery) .getResultList ();

5. Zaključak

U ovom smo uputstvu koristili API JPA kriterija za implementaciju slučajeva upotrebe u kojima smo trebali kombinirati predikate I / ILI.

Kao i obično, cjelokupni izvorni kod korišten za ovaj vodič je gotov na GitHubu.