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:
- červená alebo modrá farba
A
- 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ď:
- červená farba a stupeň D
ALEBO
- 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.