API de critérios - um exemplo de expressões IN

API de critérios - um exemplo de expressões IN

1. Visão geral

Muitas vezes encontramos problemas nos quais precisamos consultar entidades com base no fato de um atributo de valor único ser um membro de uma determinada coleção.

Neste tutorial, aprenderemos como resolver esse problema com a ajuda doCriteria API.

2. Entidades de amostra

Antes de começar, vamos dar uma olhada nas entidades que vamos usar em nosso artigo.

Temos uma classeDeptEmployee que tem ummany-to-one relationship com uma classeDepartment:

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

    private String title;

    @ManyToOne
    private Department department;
}

Além disso, a entidadeDepartment que mapeia para váriosDeptEmployees:

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

    private String name;

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

3. OCriteriaBuilder.In

Em primeiro lugar, vamos usar a interfaceCriteriaBuilder. The in() method accepts an Expression and returns a new Predicate of the CriteriaBuilder.In type_._ Ele pode ser usado para testar se a expressão dada está contida na lista de valores:

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

Como alternativa, podemos usar um conjunto de métodosin() sobrecarregados da 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. Como podemos ver, também simplifica um pouco nosso código.

5. Expressões IN usando subconsultas

Até agora, usamos coleções com valores predefinidos. Agora, vamos dar uma olhada em um exemplo de quando uma coleção é derivada de uma saída de uma subconsulta.

Por exemplo, podemos buscar todos osDeptEmployees que pertencem aDepartment, com a palavra-chave especificada em seus nomes:

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

Aqui, criamos uma subconsulta que foi então passada paravalue() como uma expressão para pesquisar a entidadeDepartment.

6. Conclusão

Neste artigo rápido, aprendemos maneiras diferentes de obter a operação IN usando a API de critérios. Também exploramos como usar a API de critérios com subconsultas.

Por fim, a implementação completa deste tutorial éavailable on GitHub.