2
respostas

Erro de exception

Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.query.sqm.sql.internal.InstantiationException: Error performing dynamic instantiation : br.com.alura.lojaoficial.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.lojaoficial.dao.PedidoDAO.relatorioDeVendas(PedidoDAO.java:48)
    at br.com.alura.lojaoficial.testes.CadastroDePedido.main(CadastroDePedido.java:55)
Caused by: org.hibernate.query.sqm.sql.internal.InstantiationException: Error performing dynamic instantiation : br.com.alura.lojaoficial.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.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
    at org.hibernate.sql.results.graph.instantiation.internal.DynamicInstantiationAssemblerConstructorImpl.assemble(DynamicInstantiationAssemblerConstructorImpl.java:52)
    ... 14 more

Codigo:

package br.com.alura.lojaoficial.dao;

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

import javax.persistence.EntityManager;

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

public class PedidoDAO {

    private EntityManager em;


    // Recebendo o entitymanger
    public PedidoDAO(EntityManager em) {
        this.em = em;
    }
    // Usar o entity manager
    public void cadastrar(Pedido pedido) {
        em.persist(pedido);
    }
    // Buscar por um ID
    public Pedido buscarPorId(Long id) {
        return em.find(Pedido.class, id);

    }
    // Valor total de todos os pedidos -  Consulta com função de agregação
    public BigDecimal valorTotalVendido() {
        String jqpl = "SELECT SUM(p.valorTotal) FROM Pedido p";
        return em.createQuery(jqpl, BigDecimal.class)
                .getSingleResult();
    }

    // Relatorio de pedidos de 3 informações distintas
    // Cada linha é um array de object
    public List<RelatorioDeVendasVo> relatorioDeVendas(){
        String jpql = "SELECT new br.com.alura.lojaoficial.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 item.quantidade DESC";
        return em.createQuery(jpql, RelatorioDeVendasVo.class).getResultList();
    }

}
2 respostas

CONTINUANDO

package br.com.alura.lojaoficial.testes;

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

import javax.persistence.EntityManager;

import br.com.alura.lojaoficial.dao.CategoriaDAO; import br.com.alura.lojaoficial.dao.ClienteDAO; import br.com.alura.lojaoficial.dao.PedidoDAO; import br.com.alura.lojaoficial.dao.ProdutoDAO; import br.com.alura.lojaoficial.modelo.Categoria; import br.com.alura.lojaoficial.modelo.Cliente; import br.com.alura.lojaoficial.modelo.ItemPedido; import br.com.alura.lojaoficial.modelo.Pedido; import br.com.alura.lojaoficial.modelo.Produto; import br.com.alura.lojaoficial.util.JPAUtil; import br.com.alura.lojaoficial.vo.RelatorioDeVendasVo;

public class CadastroDePedido {

public static void main(String[] args) {
    popularBancoDeDados();

    EntityManager em = JPAUtil.getEntityManager();
    ProdutoDAO produtodao = new ProdutoDAO(em);
    ClienteDAO clientedao =  new ClienteDAO(em);

    Produto produto = produtodao.buscarPorId(1l);
    Produto produto2 = produtodao.buscarPorId(2l);
    Produto produto3 =  produtodao.buscarPorId(3l);
    Cliente cliente = clientedao.buscarPorId(1l);


    em.getTransaction().begin();


    Pedido pedido = new Pedido(cliente);
    pedido.adicionarItem(new ItemPedido(10, pedido, produto));
    pedido.adicionarItem(new ItemPedido(40, pedido, produto2));

    Pedido pedido2 = new Pedido(cliente);
    pedido.adicionarItem(new ItemPedido(2, pedido, produto3));

    PedidoDAO pedidodao =  new PedidoDAO(em);
    pedidodao.cadastrar(pedido);
    pedidodao.cadastrar(pedido2);


    em.getTransaction().commit();

    BigDecimal totalVendido = pedidodao.valorTotalVendido();
    System.out.println("Valor Total: "+totalVendido);

    List<RelatorioDeVendasVo> relatorio = pedidodao.relatorioDeVendas();
    relatorio.forEach(System.out::println);
}


public static void popularBancoDeDados() {
    // TODO Auto-generated method stub
    // Criando categoria
    Categoria celulares = new Categoria("CELULARES");
    Categoria videogames = new Categoria("VIDEOGAMES");
    Categoria informatica = new Categoria("INFORMATICA");
    /**
     * Criando um produto
     */
    Produto celular = new Produto("Xiaomi Redmi", "8gb 512gb", new BigDecimal("800"), celulares);
    Produto videogame = new Produto("Playstation 5", "Roda tudo", new BigDecimal("3000"), videogames);
    Produto macbook = new Produto("Macbook air M1", "8gb 512gb", new BigDecimal("8000"), informatica);
    Cliente cliente = new Cliente("Rodrigo", "123467");
    /**
     * Conexão com o banco de dados com o entity
     */
    EntityManager em = JPAUtil.getEntityManager();
    ProdutoDAO produtodao = new ProdutoDAO(em);
    CategoriaDAO categoriadao = new CategoriaDAO(em);
    ClienteDAO clientedao =  new ClienteDAO(em);
    /**
     * Adicionando o produto
     */
    // Iniciando conexão
    em.getTransaction().begin();

    // cadastrando o produto  e categoria na dao
    categoriadao.cadastrar(celulares);
    categoriadao.cadastrar(informatica);
    categoriadao.cadastrar(videogames);
    produtodao.cadastrar(macbook);
    produtodao.cadastrar(videogame);
    produtodao.cadastrar(celular);

    clientedao.cadastrar(cliente);

    // Commit - adicionando
    em.getTransaction().commit();
    // Close
    em.close();
}

}

Oi Luiz,

O erro indica um problema no seu método que devolve o relatório:

 public List<RelatorioDeVendasVo> relatorioDeVendas(){
        String jpql = "SELECT new br.com.alura.lojaoficial.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 item.quantidade DESC";
        return em.createQuery(jpql, RelatorioDeVendasVo.class).getResultList();
    }

Verifica na sua classe RelatorioDeVendasVo se tem o construtor com os mesmos parâmetros utilizados no select new dessa querie.