Рубрики
Без рубрики

Критерии API – Пример выражений IN

Узнайте о различных способах достижения операции IN с помощью API Criteria.

Автор оригинала: baeldung.

Критерии 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 List employees;
}

3. CriteriaBuilder.In

Прежде всего, давайте использовать КритерииСтроитель интерфейс. в() метод принимает Выражение и возвращает новую Предикат из CriteriaBuilder.In тип . Он может быть использован для проверки того, содержится ли данное выражение в списке значений:

CriteriaQuery criteriaQuery = 
  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, которые принадлежат к Департамент, с указанным ключевым словом в их имени:

Subquery subquery = 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 .