Como realizar consultas a tabelas criadas pelo @ElementCollection?

4 respostas
luancorumba

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?

4 Respostas

luancorumba

Nada?

fbl.lucas

Eu ja fiz isso com o Criteria do Hibernate 3 mas estou sem acesso ao código no nomento, mas pelo que eu lembro esta faltando annotation no atributo ai.
coloca a anotação @Enumerated(EnumType.STRING), só para testar.

@ElementCollection
@Enumerated(EnumType.STRING)
private List<DiaDaSemana> dias;
luancorumba

Quando possuir o código, por favor me envie.

A anotação @Enumerated(EnumType.STRING) é opcional. Caso eu não coloque esta anotação o JPA utiliza a forma numérica para a representação da enumeração.

luancorumba

consegui fazer funcionar com esse predicate:

Mas isso só funciona usando o

devido a algum bug do EclipseLink que não consegue converter a representação numérica em enumeração durante a comparação.
De qualquer forma, em ambos os casos, a coluna que guarda o valor da enumeração é criada como um varchar(255)[achei isso um erro também].

Criado 2 de dezembro de 2011
Ultima resposta 29 de dez. de 2011
Respostas 4
Participantes 2