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

1. Übersicht

Wir stoßen häufig auf Probleme, bei denen wir Entitäten abfragen müssen, basierend darauf, ob ein einwertiges Attribut Mitglied einer bestimmten Sammlung ist.

In diesem Tutorial erfahren Sie, wie Sie dieses Problem mithilfe der Kriterien- API lösen .

2. Beispielentitäten

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

Wir haben eine DeptEmployee- Klasse, die eine Eins -zu-Eins-Beziehung zu einer Abteilungsklasse hat :

@Entity public class DeptEmployee { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private long id; private String title; @ManyToOne private Department department; }

Die Abteilungsentität , die mehreren DeptEmployees zugeordnet ist :

@Entity public class Department { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private long id; private String name; @OneToMany(mappedBy="department") private List employees; }

3. Der CriteriaBuilder.In

Verwenden wir zunächst die CriteriaBuilder- Oberfläche. Die in () -Methode akzeptiert einen Ausdruck und gibt ein neues Prädikat vom Typ CriteriaBuilder.In zurück . Es kann verwendet werden, um zu testen, 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. Der Ausdruck.In

Alternativ können wir eine Reihe überladener in () -Methoden von der Expression- Schnittstelle verwenden:

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

Im Gegensatz zum CriteriaBuilder. in () , die Expression.in () akzeptiert eine Sammlung von Werten. Wie wir sehen können, vereinfacht es 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 alle DeptEmployee-Mitarbeiter , die zu einer Abteilung gehören, mit dem angegebenen Schlüsselwort in ihrem Namen abrufen :

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 für die Suche nach der Abteilungsentität an value () übergeben wurde .

6. Fazit

In diesem kurzen Artikel haben wir verschiedene Möglichkeiten kennengelernt, um die IN-Operation mithilfe der Kriterien-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 Tutorial auf GitHub verfügbar.