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

[Dúvida] Erro ClassNotFound para br.com.alura.loja.vo.RelatorioDeVendasVo

Ola pessoal,

Estou tomando esse erro:

Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: Unable to locate class [br.com.alura.loja.vo.RelatorioDeVendasVo] [SELECT new br.com.alura.loja.vo.RelatorioDeVendasVo(produto.nome, SUM(item.quantidade), MAX(pedido.dataCadastro)) FROM br.com.alura.loja.modelo.Pedido pedido JOIN pedido.itens item JOIN item.produto produto GROUP BY produto.nome ORDER BY item.quantidade DESC]

Ao tentar executar a query com select new mais o canonical name da classe br.com.alura.loja.vo.RelatorioDeVendasVo, e nao vai.

package br.com.alura.loja.dao;

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


import javax.persistence.EntityManager;
import java.math.BigDecimal;
import java.util.List;

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<br.com.alura.loja.vo.RelatorioDeVendasVO> relatorioDeVendas() {
        String jpql = "SELECT new br.com.alura.loja.vo.RelatorioDeVendasVo(" +
                "produto.nome, " +
                "SUM(item.quantidade), " +
                "MAX(pedido.dataCadastro)) " +
                "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();
    }

}
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;
    }

    @Override
    public String toString() {
        return "RelatorioDeVendasVO{" +
                "nomeProduto='" + nomeProduto + '\'' +
                ", quantidadeVendida=" + quantidadeVendida +
                ", dataUltimaVenda=" + dataUltimaVenda +
                '}';
    }
}

Alguem tem alguma dica ?

2 respostas
solução!

Oi Eduardo!

O seu select está assim: SELECT new br.com.alura.loja.vo.RelatorioDeVendasVo, mas o nome da classe é RelatorioDeVendasVO com a letra O em maiúsculo.

Eita! Nao percebi. Obrigado!

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