Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Error performing dynamic instantiation : br.com.alura.loja.vo.RelatorioDeVendasVo - RESOLVIDO - trocar LONG por INTEGER na RelatorioDeVendasVo

Minha Classe RelatorioDeVendasVo:

package br.com.alura.loja.vo;

import java.time.LocalDate;

public class RelatorioDeVendasVo {
    private String nomeProduto;
    private Long quantidadeVendida;
    private LocalDate dataUltimaVenda;

    public RelatorioDeVendasVo(String nomeProduto, Long quantidadeVendida, LocalDate dataUltimaVenda) {
        this.nomeProduto = nomeProduto;
        this.quantidadeVendida = quantidadeVendida;
        this.dataUltimaVenda = dataUltimaVenda;
    }

    public String getNomeProduto() {
        return nomeProduto;
    }

    public Long getQuantidadeVendida() {
        return quantidadeVendida;
    }

    public LocalDate getDataUltimaVenda() {
        return dataUltimaVenda;
    }

    @Override
    public String toString() {
        return "RelatorioDeVendasVo [nomeProduto=" + nomeProduto + ", quantidadeVendida=" + quantidadeVendida
                + ", dataUltimaVenda=" + dataUltimaVenda + "]";
    }

}

Minha Classe PedidoDao:

package br.com.alura.loja.dao;

import java.math.BigDecimal;
import java.util.List;

import javax.persistence.EntityManager;

import br.com.alura.loja.modelo.Pedido;
import br.com.alura.loja.vo.RelatorioDeVendasVo;

public class PedidoDao {

    private EntityManager em;

    public PedidoDao(EntityManager em) {
        this.em = em;
    }

    public void cadastrar(Pedido pedido) {
        this.em.persist(pedido);
    }

    public BigDecimal valorTotalVendido() {
        String jpql = "SELECT SUM(p.valorTotal) from Pedido p";
        return em.createQuery(jpql, BigDecimal.class).getSingleResult();
    }

    public List<RelatorioDeVendasVo> relatorioDeVendas(){
        String jpql = "SELECT new br.com.alura.loja.vo.RelatorioDeVendasVo("
                + "produto.nome, "
                + "SUM(item.quantidade), "
                + "MAX(pedido.data)) "
                + "FROM Pedido pedido "
                + "JOIN pedido.itens item "
                + "JOIN item.produto produto "
                + "GROUP BY produto.nome "
                + "ORDER BY SUM(item.quantidade) DESC ";

        return em.createQuery(jpql, RelatorioDeVendasVo.class).getResultList();
    }
}

O erro que está dando é:

Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.query.sqm.sql.internal.InstantiationException: Error performing dynamic instantiation : br.com.alura.loja.vo.RelatorioDeVendasVo
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:166)
    at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:193)
    at org.hibernate.query.spi.AbstractQuery.list(AbstractQuery.java:1373)
    at org.hibernate.query.Query.getResultList(Query.java:131)
    at br.com.alura.loja.dao.PedidoDao.relatorioDeVendas(PedidoDao.java:39)
    at br.com.alura.loja.teste.CadastroDePedido.main(CadastroDePedido.java:53)
Caused by: org.hibernate.query.sqm.sql.internal.InstantiationException: Error performing dynamic instantiation : br.com.alura.loja.vo.RelatorioDeVendasVo
    at org.hibernate.sql.results.graph.instantiation.internal.DynamicInstantiationAssemblerConstructorImpl.assemble(DynamicInstantiationAssemblerConstructorImpl.java:58)
    at org.hibernate.sql.results.internal.StandardRowReader.readRow(StandardRowReader.java:93)
    at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:66)
    at org.hibernate.sql.results.spi.ListResultsConsumer.consume(ListResultsConsumer.java:24)
    at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.doExecuteQuery(JdbcSelectExecutorStandardImpl.java:228)
    at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.executeQuery(JdbcSelectExecutorStandardImpl.java:146)
    at org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl.list(JdbcSelectExecutorStandardImpl.java:74)
    at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.lambda$new$0(ConcreteSqmSelectQueryPlan.java:80)
    at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.withCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:248)
    at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:191)
    at org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:513)
    at org.hibernate.query.spi.AbstractQuery.list(AbstractQuery.java:1364)
    ... 3 more
Caused by: java.lang.IllegalArgumentException: argument type mismatch
    at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:70)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:483)
    at org.hibernate.sql.results.graph.instantiation.internal.DynamicInstantiationAssemblerConstructorImpl.assemble(DynamicInstantiationAssemblerConstructorImpl.java:52)
    ... 14 more
Caused by: java.lang.ClassCastException: Cannot cast java.lang.Integer to java.lang.Long

Entretanto, está dando erro na hora de executar. Como resolver?

1 resposta
solução!

Problema resolvido. Estou usando o banco de dados MySQL. Precisei alterar o tipo de da variável quantidadeVendida para Integer. Fazendo dessa forma, deu certo.