Consulta dinâmica do JPA 2.0 usando API de critérios
-
22-09-2019 - |
Pergunta
Estou um pouco preso construindo uma consulta dinâmica usando o critério do JPA 2.0.
Eu tenho um caso de uso bastante comum, eu acho: o usuário fornece uma quantidade arbitrária de parâmetros de pesquisa x para ser e / ou concatenada: como:
select e from Foo where (name = X1 or name = X2 .. or name = Xn )
O método ou de critério não é dinâmico:
Predicado ou (predicado ... restrições)
Ideias? Amostras?
Solução
No seu caso, eu prefiro usar Expression#in(Collection)
para evitar ter que fazer loop e construir um composto Predicate
dinamicamente:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Foo> cq = cb.createQuery(Foo.class);
Metamodel m = em.getMetamodel();
EntityType<Foo> Foo_ = m.entity(Foo.class);
Root<Foo> foo = cq.from(Foo_);
cq.where(my.get(Foo_.name).in(params));
Você pode querer verificar Consultas básicas à segurança do tipo usando a API de critérios e API de metamodelo para mais detalhes.
Outras dicas
Neste código foo_.name vai dar um erro de compilação. Como o campo não é declarado nisso. Não sou capaz de entender isso. Por favor me sugira.
-raghu