Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

Erro no Named Parameter: java.lang.IllegalArgumentException

Código java:

        EntityManager em = new JPAUtil().getEntityManager();
        em.getTransaction().begin();

        Conta conta = new Conta();
        conta.setId(1);

        String jpql = "select m from Movimentacao m where m.conta.id =:pConta";
        Query query = em.createQuery(jpql);        
        query.setParameter("pConta", conta);

Console:

Exception in thread "main" java.lang.IllegalArgumentException: Parameter value [br.com.financas.modelo.Conta@5d465e4b] did not match expected type [java.lang.Integer (n/a)]
10 respostas

Oi Welber, Vc está procurando na query quer pelo id, mas está passando como parâmetro uma conta

Thiago no vídeo ele está passado uma conta como parâmetro, no vídeo ele disse que está comparando a conta.

No primeiro exemplo foi assim, comparando o valor da tabela.

String jpql = "select m from Movimentacao m where m.conta.id = 2";
        Query query = em.createQuery(jpql);

No segundo foi esse, comparando o objeto.

Conta conta = new Conta();
        conta.setId(2);

        String jpql = "select m from Movimentacao m where m.conta.id =:pConta";
        Query query = em.createQuery(jpql);        
        query.setParameter("pConta", conta);

Oi Welber, Nesse caso é só substituir o trecho da jpql m.conta.id por m.conta .

Continua com o mesmo erro Thiago.

Pode colar aqui como ficou seu último código por favor?

Código

Conta conta = new Conta();
        conta.setId(2);

        String jpql = "select m from Movimentacao m where conta.id = :pConta";
        Query query = em.createQuery(jpql);        
        query.setParameter("pConta", conta);

Console:

Exception in thread "main" java.lang.IllegalArgumentException: Parameter value [br.com.financas.modelo.Conta@5d465e4b] did not match expected type [java.lang.Integer (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.AbstractProducedQuery.setParameter(AbstractProducedQuery.java:482)
    at org.hibernate.query.internal.AbstractProducedQuery.setParameter(AbstractProducedQuery.java:104)
    at br.com.financas.teste.TesteJPQL.main(TesteJPQL.java:24)
solução!

Ainda está com um probleminha na query. Note que vc está procurando pelo id da Conta na query (m.conta.id), mas vc está passabdo como parâmetro um ojeto Conta . Tanto na query como no setParameter eles tem que ser do mesmo tipo.

Não está Thiago, está conforme você pediu a alteração:

Conta conta = new Conta();
        conta.setId(2);

        String jpql = "select m from Movimentacao m where conta.id = :pConta";
        Query query = em.createQuery(jpql);        
        query.setParameter("pConta", conta);

Perdão Thiago, você está certo.

Conta conta = new Conta();
        conta.setId(2);

        String jpql = "select m from Movimentacao m where m.conta = :pConta";
        Query query = em.createQuery(jpql);        
        query.setParameter("pConta", conta);

Agora deu certinho. Obrigado Thiago.

Que bom :) Bons estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software