2
respostas

JPQL com "select in " em uma lista de objeto como parâmetro não está funcionando com Hibernate.

Tenho o seguinte método com a JPQL:

private List<Integer> findByCustomers(List<JiraCliente> clientes) {
        String jpql = "SELECT DISTINCT u.idx FROM Usuario u WHERE u.clientes IN :clientes ORDER BY u.nome, u.sobrenome";
        TypedQuery<Integer> query = em.createQuery(jpql, Integer.class);
        query.setParameter("clientes", clientes);
        return query.getResultList();

    }

Porém quando executo esta query, recebo o seguinte erro:

java.lang.IllegalArgumentException: Parameter value [JiraCliente@37ea2d9a] did not match expected type [java.util.Collection (n/a)]
        at org.hibernate.query.spi.QueryParameterBindingValidator.validate(QueryParameterBindingValidator.java:54)
        at org.hibernate.query.spi.QueryParameterBindingValidator.validate(QueryParameterBindingValidator.java:27)
        at org.hibernate.query.internal.QueryParameterBindingImpl.validate(QueryParameterBindingImpl.java:90)
        at org.hibernate.query.internal.QueryParameterBindingImpl.setBindValue(QueryParameterBindingImpl.java:55)
        at org.hibernate.query.internal.QueryParameterBindingsImpl.expandListValuedParameters(QueryParameterBindingsImpl.java:577)
        at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1536)
        at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1505)
        at org.hibernate.query.Query.getResultList(Query.java:135)

Este erro ocorre com o projeto usando Hibernate. Fiz um teste com Eclipselink e a consulta executa normalmente. O erro ocorre nesse ponto "query.setParameter("clientes", clientes)". O método "setParameter(String string, Object o)" espera como argumento uma string e um objeto mas parece que ele não está fazendo o parse de object para a lista do tipo que passei.

2 respostas

Olá Everton!

Tenta usar o método setParameterList:

query.setParameterList("clientes", clientes);

Veja se funciona pra ti.

Aguardo seu retorno!

Olá Guilherme. É que no caso estou usando a JPA com EntityManager. Para poder usar o setParameterList eu teria que utilizar a Session. Porém com a session eu ficaria preso ao Hibernate e não conseguiria mudar de implementação como Eclipselink ou OpenJPA caso fosse necessário.