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

Observação quanto à aula 2 Java e JPA.

O jpql contem um erro se houver a venda de um mesmo produto em pedidos diferentes. No order by deve contem também a função de agregação SUM() para o correto funcionamento.

    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();
    }
4 respostas
solução!

Oi,

Bem observado!

Valeu pelo feedback :)

Bons estudos!

Obrigado!

Uma outra sugestão, no lugar de repetir a função, é dar um nome ao resultado do SUM e reutilizar este nome. Abaixo usei "totalqtd":

    public List<RelatorioDeVendasVo> gerarRelatorio(){
        String jpql = "SELECT new br.com.alura.loja.vo.RelatorioDeVendasVo("
                + "produto.nome, "
                + "SUM(item.quantidade) as totalqtd, "
                + "MAX(pedido.data)) "
                + "FROM Pedido pedido "
                + "JOIN pedido.itens item "
                + "JOIN item.produto produto "
                + "GROUP BY produto.nome "
                + "ORDER BY totalqtd DESC";
        return em.createQuery(jpql, RelatorioDeVendasVo.class)
                .getResultList();
    }

No caso estou rodando com o mssql 2019.

Sim Lucas, funciona, mas pelo que me recordo em alguns SGBDs não, por não estar na especificação ANSI SQL. Tive essa limitação há bastante tempo atrás e fui pesquisar. No link https://docs.microsoft.com/en-us/sql/t-sql/queries/select-group-by-transact-sql?view=sql-server-2017, seção SELECT-GROUP BY:

The column expression cannot contain: A column alias that is defined in the SELECT list. It can use a column alias for a derived table that is defined in the FROM clause.

No caso do Hibernate não sei se ele funciona , mesmo com o o SQL Server.