Комбиниране на JPA и / или критерии за предикати

1. Общ преглед

API на критериите JPA може да се използва за лесно добавяне на множество условия И / ИЛИ при заявка на записи в база данни. В този урок ще разгледаме бърз пример за заявки за критерии на JPA, които комбинират множество предикати И / ИЛИ.

Ако не сте запознати с предикатите, предлагаме първо да прочетете за основните заявки за критерии на JPA.

2. Примерно приложение

За нашите примери ще разгледаме опис на обектите на артикулите , всеки от които с идентификатор, име , цвят и оценка :

@Entity public class Item { @Id private Long id; private String color; private String grade; private String name; // standard getters and setters }

3. Комбиниране на два ИЛИ предикати с използване на предикат И

Нека да разгледаме случая на използване, когато трябва да намерим елементи, които имат и двете:

  1. червен или син цвят

    И

  2. А или Б клас

Лесно можем да направим това, използвайки JPA Criteria API и () и или () съставни предикати .

За начало нека настроим нашата заявка:

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

Сега ще трябва да изградим предикат, за да намерим елементи със син или червен цвят:

Predicate predicateForBlueColor = criteriaBuilder.equal(itemRoot.get("color"), "blue"); Predicate predicateForRedColor = criteriaBuilder.equal(itemRoot.get("color"), "red"); Predicate predicateForColor = criteriaBuilder.or(predicateForBlueColor, predicateForRedColor);

След това нека изградим предикат, за да намерим елементи от клас A или B:

Predicate predicateForGradeA = criteriaBuilder.equal(itemRoot.get("grade"), "A"); Predicate predicateForGradeB = criteriaBuilder.equal(itemRoot.get("grade"), "B"); Predicate predicateForGrade = criteriaBuilder.or(predicateForGradeA, predicateForGradeB);

И накрая, дефинираме И предиката на тези две, прилагаме метода where () и изпълняваме нашата заявка:

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

4. Комбиниране на два И предикати с помощта на ИЛИ предикат

От друга страна, нека да разгледаме случая, в който трябва да намерим елементи, които имат или:

  1. червен цвят и степен D

    ИЛИ

  2. син цвят и степен Б

Логиката е доста подобна, но тук първо създаваме две И предикати и след това ги комбинираме с помощта на ИЛИ предикат :

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Item.class); Root itemRoot = criteriaQuery.from(Item.class); Predicate predicateForBlueColor = criteriaBuilder.equal(itemRoot.get("color"), "red"); Predicate predicateForGradeA = criteriaBuilder.equal(itemRoot.get("grade"), "D"); Predicate predicateForBlueColorAndGradeA = criteriaBuilder.and(predicateForBlueColor, predicateForGradeA); Predicate predicateForRedColor = criteriaBuilder.equal(itemRoot.get("color"), "blue"); Predicate predicateForGradeB = criteriaBuilder.equal(itemRoot.get("grade"), "B"); Predicate predicateForRedColorAndGradeB = criteriaBuilder.and(predicateForRedColor, predicateForGradeB); Predicate finalPredicate = criteriaBuilder .or(predicateForBlueColorAndGradeA, predicateForRedColorAndGradeB); criteriaQuery.where(finalPredicate); List items = entityManager.createQuery(criteriaQuery).getResultList();

5. Заключение

В този урок използвахме приложния програмен интерфейс (API) за критерии на JPA, за да приложим случаи на използване, където трябваше да комбинираме предикатите И / ИЛИ.

Както обикновено, пълният изходен код, използван за този урок, е свършен на GitHub.