API de critères - Exemple d’expressions IN

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.