Критерии API – Пример выражений IN
1. Обзор
Мы часто сталкиваемся с проблемами, когда нам нужно запрашивать сущности в зависимости от того, является ли одно ценимый атрибут членом данной коллекции.
В этом учебнике мы узнаем, как решить эту проблему с помощью API Criteria.
2. Образцы сущностей
Прежде чем мы начнем, давайте посмотрим на объекты, которые мы собираемся использовать в нашей записи.
У нас есть DeptEmployee класс, который имеет отношения между многими и с Департамент класс:
@Entity public class DeptEmployee { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private long id; private String title; @ManyToOne private Department department; }
Кроме того, Департамент сущность, которая отображает несколько DeptEmployees :
@Entity public class Department { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private long id; private String name; @OneToMany(mappedBy="department") private Listemployees; }
3. CriteriaBuilder.In
Прежде всего, давайте использовать КритерииСтроитель интерфейс. в() метод принимает Выражение и возвращает новую Предикат из CriteriaBuilder.In тип . Он может быть использован для проверки того, содержится ли данное выражение в списке значений:
CriteriaQuerycriteriaQuery = criteriaBuilder.createQuery(DeptEmployee.class); Root root = criteriaQuery.from(DeptEmployee.class); In inClause = criteriaBuilder.in(root.get("title")); for (String title : titles) { inClause.value(title); } criteriaQuery.select(root).where(inClause);
4. Expression.In
Кроме того, мы можем использовать набор перегруженных в() методы из Выражение интерфейс:
criteriaQuery.select(root) .where(root.get("title") .in(titles));
В отличие от КритерийСтроитель. в() , Expression.in () принимает коллекцию ценностей. Как мы видим, это также немного упрощает наш код.
5. В выражениях с использованием субкерий
До сих пор мы использовали коллекции с предопределенными значениями. Теперь рассмотрим пример, когда коллекция получена из вывода подкери.
Например, мы можем получить все DeptEmployee s, которые принадлежат к Департамент, с указанным ключевым словом в их имени:
Subquerysubquery = criteriaQuery.subquery(Department.class); Root dept = subquery.from(Department.class); subquery.select(dept) .distinct(true) .where(criteriaBuilder.like(dept.get("name"), "%" + searchKey + "%")); criteriaQuery.select(emp) .where(criteriaBuilder.in(emp.get("department")).value(subquery));
Здесь мы создали покорный, который затем был передан в значение () в качестве выражения для поиска Департамент сущность.
6. Заключение
В этой быстрой статье мы изучили различные способы достижения операции IN с помощью API Criteria. Мы также изучили, как использовать API Критерии с подармиями.
Наконец, полная реализация этого учебника доступны на GitHub .