Olá pessoal.
Gostaria de saber se alguém pode me ajudar a utilizar a instrução in do CriteriaBuilder, considerando uma lista de valores (List) previamente carregada.
O código que segue abaixo, eu já sei que não funciona ( o problema está exatamente no momento de montar a instrução In que não sei como montar baseando-se em uma lista ).
Pesquisei sobre o assunto buscando no google, no guj, javaranch e no livro pro JPA 2.0, porém a única forma que mostram como usar o in, é utilizando a seguinte estrutura:
Porém a estrutura acima não me interessa, pois eu não conseguiria manter algo dinâmico como estou buscando.
Abaixo segue o exemplo de código onde eu gostaria de usar o In de forma mais efetiva:
public class CadastroProjetoServiceImpl implements CadastroProjetoService {
@PersistenceContext
private EntityManager em;
@Override
public List<Projeto> pesquisarProjetos(IConsultaProjetoTO projeto) throws CadastroException {
List<Projeto> lista = new ArrayList<Projeto>();
try {
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Projeto> queryProjeto = builder.createQuery(Projeto.class);
Root<Projeto> projetoRoot = queryProjeto.from(Projeto.class);
queryProjeto.select(projetoRoot);
List<Predicate> predicados = new ArrayList<Predicate>();
// varios predicados construidos dinamicamente............
if (projeto.getListaStatusProjeto() != null && projeto.getListaStatusProjeto().size() > 0) {
predicados.add(builder.in(
projetoRoot.get(Projeto_.statusProjeto).in(
projeto.getListaStatusProjeto())));
}
// cria o where com as clausulas de filtro da select
if (predicados.size() > 0) {
queryProjeto.where(builder.and(predicados.toArray(new Predicate[]{})));
}
lista = em.createQuery(queryProjeto).getResultList();
} catch (PersistenceException e) {
throw new CadastroException(e);
}
return lista;
}
Obrigado.