Kombinácia predikátov JPA a / alebo kritérií

1. Prehľad

Rozhranie API JPA Criteria možno použiť na ľahké pridanie viacerých podmienok AND / OR pri dotazovaní na záznamy v databáze. V tomto tutoriáli preskúmame rýchly príklad dotazov na kritériá JPA, ktoré kombinujú viac predikátov AND / OR.

Ak nepoznáte predikáty, odporúčame vám prečítať si najskôr informácie o základných kritériách JPA.

2. Ukážka aplikácie

Pre naše príklady zvážime zoznam Položka subjekty, z ktorých každý má id,názov, farbaa stupeň:

@Entity public class Item {@Id private Long id; súkromná farba reťazca; súkromná známka; súkromné ​​meno reťazca; // štandardné getre a setre}

3. Kombinácia dvoch ALEBO Predikáty pomocou A Predikát

Zvážme prípad použitia, keď potrebujeme nájsť položky, ktoré majú obe:

  1. červená alebo modrá farba

    A

  2. Známka A alebo B.

Môžeme to ľahko urobiť pomocou API JPA Criteria a () a alebo () zložené predikáty.

Na začiatok nastavíme náš dopyt:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder (); CriteriaQuery kritériáQuery = kritériaBuilder.createQuery (Položka.trieda); Koreňový itemRoot = criteriaQuery.from (Item.class);

Teraz budeme musieť postaviť Predikát vyhľadanie položiek, ktoré majú modrú alebo červenú farbu:

Predikát predikátForBlueColor = kritériaBuilder.equal (itemRoot.get ("farba"), "modrá"); Predicate predicateForRedColor = criteriaBuilder.equal (itemRoot.get ("color"), "red"); Predicate predicateForColor = criteriaBuilder.or (predicateForBlueColor, predicateForRedColor);

Ďalej si postavme a Predikát vyhľadanie položiek triedy A alebo B:

Predikát predicateForGradeA = kritériaBuilder.equal (itemRoot.get ("známka"), "A"); Predikát predicateForGradeB = kritériaBuilder.equal (itemRoot.get ("známka"), "B"); Predicate predicateForGrade = criteriaBuilder.or (predicateForGradeA, predicateForGradeB);

Nakoniec definujeme AND Predikát z týchto dvoch platí kde() metódou a vykonajte náš dopyt:

Predikát finalPredicate = kritériaBuilder.and (predicateForColor, predicateForGrade); kritériaQuery.where (finalPredicate); Zoznam položiek = entityManager.createQuery (kritériaQuery) .getResultList ();

4. Kombinácia dvoch A Predikáty pomocou ALEBO Predikát

Na druhej strane zvážime prípad, keď musíme nájsť položky, ktoré majú buď:

  1. červená farba a stupeň D

    ALEBO

  2. modrá farba a stupeň B

Logika je dosť podobná, ale tu vytvoríme dva AND Predikáts a potom ich skombinujte pomocou ALEBO Predikát:

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder (); CriteriaQuery kritériáQuery = kritériaBuilder.createQuery (Položka.trieda); Koreňový itemRoot = criteriaQuery.from (Item.class); Predicate predicateForBlueColor = criteriaBuilder.equal (itemRoot.get ("color"), "red"); Predikát predicateForGradeA = kritériaBuilder.equal (itemRoot.get ("známka"), "D"); Predikát predicateForBlueColorAndGradeA = kritériaBuilder.and (predicateForBlueColor, predicateForGradeA); Predicate predicateForRedColor = criteriaBuilder.equal (itemRoot.get ("color"), "blue"); Predikát predicateForGradeB = kritériaBuilder.equal (itemRoot.get ("známka"), "B"); Predicate predicateForRedColorAndGradeB = criteriaBuilder.and (predicateForRedColor, predicateForGradeB); Predikát finalPredicate = kritériaBuilder .or (predicateForBlueColorAndGradeA, predicateForRedColorAndGradeB); riteryQuery.where (finalPredicate); Zoznam položiek = entityManager.createQuery (kritériaQuery) .getResultList ();

5. Záver

V tomto tutoriáli sme použili API JPA Criteria na implementáciu prípadov použitia, keď sme potrebovali skombinovať predikáty AND / OR.

Kompletný zdrojový kód použitý v tomto výučbe je ako obvykle na GitHub.


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