Olá,
Estou utilizando o JPA 2 com o EclipseLink e utilizando o Criteria API + Metadata API para realizar as minhas consultas ao banco em uma aplicação que desenvolvo. Hoje surgiu-me a necessidade de criar uma CriteriaQuery onde eu precisarei, além de outros critérios, listar entidades que possuam uma enumeração específica em sua lista que possui a enumeração @ElementCollection. Ex:
@ElementCollection
private List<DiaDaSemana> dias;
Preciso listar as entidades que possuam a enumeração DiaDaSemana.SEXTA em sua lista “dias”.
Criando a consulta:
public List<Evento> listarPorData(Calendar data, Cidade cidade){
EntityManager em = getEntityManager();
try {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery cq = cb.createQuery(Entidade.class);
Root<Entidade> rt = cq.from(Entidade.class);
cq.where(cb.and(
cb.equal(rt.get(Entidade_.dtInicial), data),
cb.equal(rt.join(Entidade_.cidade)
.get(Cidade_.id), cidade.getId())
)),
cb.isMember(DiaDaSemana.values()[data.get(Calendar.DAY_OF_WEEK)], rt.get(Evento_.dias))
.orderBy(cb.asc(rt.get(Entidade_.dtInicial)));
Query q = em.createQuery(cq);
return q.getResultList();
} finally {
em.close();
}
}
No exemplo que demonstrei ocorre um erro de compilação por eu não saber estar criando esse critério direito. Já tentei cria-lo de 3 formas diferentes, mas nenhuma foi possível sem um erro de compilação.
Nesse exemplo específico eu ocorre erro por DiaDaSemana não ser uma Entidade JPA e por rt.get() está referenciando uma lista.
cb.isMember(DiaDaSemana.values()[data.get(Calendar.DAY_OF_WEEK)], rt.get(Evento_.dias))
Alguém tem alguma ideia de como resolver o meu problema?