Kriterien-API - Beispiel für IN-Ausdrücke

Kriterien-API - Ein Beispiel für IN-Ausdrücke

1. Überblick

Es treten häufig Probleme auf, bei denen Entitäten basierend darauf abgefragt werden müssen, ob ein einwertiges Attribut Mitglied einer bestimmten Auflistung ist.

In diesem Tutorial erfahren Sie, wie Sie dieses Problem mithilfe vonCriteria APIlösen.

2. Beispielobjekte

Bevor wir beginnen, werfen wir einen Blick auf die Entitäten, die wir in unserem Artikel verwenden werden.

Wir haben eineDeptEmployee-Klasse, die einemany-to-one relationship mit einerDepartment-Klasse hat:

@Entity
public class DeptEmployee {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;

    private String title;

    @ManyToOne
    private Department department;
}

Außerdem die EntitätDepartment, die mehrerenDeptEmployees zugeordnet ist:

@Entity
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;

    private String name;

    @OneToMany(mappedBy="department")
    private List employees;
}

3. DieCriteriaBuilder.In

Verwenden wir zunächst dieCriteriaBuilder-Schnittstelle. The in() method accepts an Expression and returns a new Predicate of the CriteriaBuilder.In type_._ Hiermit kann getestet werden, ob der angegebene Ausdruck in der Werteliste enthalten ist:

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. DieExpression.In

Alternativ können wir eine Reihe überladenerin()-Methoden über dieExpression-Schnittstelle verwenden:

criteriaQuery.select(root)
  .where(root.get("title")
  .in(titles));

In a contrast to the CriteriaBuilder.in(), the Expression.in() accepts a collection of values. Wie wir sehen können, vereinfacht dies auch unseren Code ein wenig.

5. IN Ausdrücke mit Unterabfragen

Bisher haben wir Sammlungen mit vordefinierten Werten verwendet. Schauen wir uns nun ein Beispiel an, bei dem eine Sammlung aus einer Ausgabe einer Unterabfrage abgeleitet wird.

Zum Beispiel können wir alleDeptEmployees abrufen, die zuDepartment, gehören, mit dem angegebenen Schlüsselwort in ihrem Namen:

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));

Hier haben wir eine Unterabfrage erstellt, die dann als Ausdruck anvalue() übergeben wurde, um nach der EntitätDepartment zu suchen.

6. Fazit

In diesem kurzen Artikel haben wir verschiedene Möglichkeiten kennengelernt, um die IN-Operation mit der Criteria-API zu erreichen. Wir haben auch untersucht, wie die Kriterien-API mit Unterabfragen verwendet wird.

Schließlich ist die vollständige Implementierung für dieses Tutorialavailable on GitHub.