API de critères - Exemple d’expressions IN
1. Vue d'ensemble
Nous rencontrons souvent des problèmes dans lesquels nous devons interroger des entités selon qu'un attribut à valeur unique est membre d'une collection donnée.
Dans ce didacticiel, nous allons apprendre à résoudre ce problème à l'aide desCriteria API.
2. Exemples d'entités
Avant de commencer, examinons les entités que nous allons utiliser dans notre rédaction.
Nous avons une classeDeptEmployee qui a unmany-to-one relationship avec une classeDepartment:
@Entity
public class DeptEmployee {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long id;
private String title;
@ManyToOne
private Department department;
}
En outre, l'entitéDepartment qui correspond à plusieursDeptEmployees:
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long id;
private String name;
@OneToMany(mappedBy="department")
private List employees;
}
3. LesCriteriaBuilder.In
Tout d’abord, utilisons l’interfaceCriteriaBuilder. The in() method accepts an Expression and returns a new Predicate of the CriteriaBuilder.In type_._ Il peut être utilisé pour tester si l'expression donnée est contenue dans la liste de valeurs:
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. LesExpression.In
Alternativement, nous pouvons utiliser un ensemble de méthodesin() surchargées depuis l'interfaceExpression:
criteriaQuery.select(root)
.where(root.get("title")
.in(titles));
In a contrast to the CriteriaBuilder.in(), the Expression.in() accepts a collection of values. Comme nous pouvons le voir, cela simplifie également un peu notre code.
5. Expressions IN utilisant des sous-requêtes
Jusqu'à présent, nous avons utilisé des collections avec des valeurs prédéfinies. Examinons maintenant un exemple lorsqu'une collection est dérivée d'une sortie d'une sous-requête.
Par exemple, nous pouvons récupérer tous lesDeptEmployees qui appartiennent à unDepartment, avec le mot-clé spécifié dans leur nom:
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));
Ici, nous avons créé une sous-requête qui a ensuite été transmise auxvalue() en tant qu'expression pour rechercher l'entitéDepartment.
6. Conclusion
Dans cet article rapide, nous avons appris différentes manières de réaliser l'opération IN à l'aide de l'API Criteria. Nous avons également exploré l’utilisation de l’API de critères avec des sous-requêtes.
Enfin, l'implémentation complète de ce didacticiel estavailable on GitHub.