6
respostas

ERROR: ERROR: column "itens1_.quantidade" must appear in the GROUP BY clause or be used in an aggregate function

Código CadastrarPedido:

package br.com.alura.teste;

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

import javax.persistence.EntityManager;

import br.com.alura.Categoria;
import br.com.alura.Cliente;
import br.com.alura.ItemPedido;
import br.com.alura.Pedido;
import br.com.alura.Produto;
import br.com.alura.dao.CategoriaDao;
import br.com.alura.dao.ClienteDao;
import br.com.alura.dao.PedidoDao;
import br.com.alura.dao.ProdutoDao;
import br.com.alura.util.JPAUtil;

public class CadastrarPedido {
    public static void main(String[] args) {
        popularBancoDeDados();
        EntityManager eManager = JPAUtil.getEntityManager();
        ProdutoDao produtoDao = new ProdutoDao(eManager);
        ClienteDao clienteDao = new ClienteDao(eManager);

        Produto produto = produtoDao.bucarPorId(1l);
        Produto produto2 = produtoDao.bucarPorId(2l);
        Produto produto3 = produtoDao.bucarPorId(3l);

        Cliente cliente = clienteDao.bucarPorId(1l);;
        eManager.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(eManager);
        pedidoDao.cadastrar(pedido);
        pedidoDao.cadastrar(pedido2);


        BigDecimal totalVendido = pedidoDao.valorTotalVendido();
        System.out.println("Valor total: "+totalVendido);

        List<Object[]>relatorio = pedidoDao.relatorioDeVendas();
        for (Object[] objects : relatorio) {
            System.out.println(objects[0]);
            System.out.println(objects[1]);
            System.out.println(objects[2]);
        }

    }

    private static void popularBancoDeDados() {
        Categoria celulares = new Categoria("CELULARES");
        Categoria videogames = new Categoria("VIDEOGAMES");
        Categoria informatica = new Categoria("INFORMATICA");

        Produto celular = new Produto("Xiaomi Redmi", "Muito Legal", new BigDecimal("800"), celulares);
        Produto videogame = new Produto("PS5", "Da Hora", new BigDecimal("5000"), videogames);
        Produto macbook = new Produto("MacBook", "Muito Bom", new BigDecimal("3000"), informatica);

        Cliente cliente = new Cliente("Rodrigo", "123456");

        EntityManager eManager = JPAUtil.getEntityManager();

        ProdutoDao produtoDao = new ProdutoDao(eManager);
        CategoriaDao categoriaDao = new CategoriaDao(eManager);
        ClienteDao clienteDao = new ClienteDao(eManager);

        eManager.getTransaction().begin();

        categoriaDao.cadastrar(celulares);
        categoriaDao.cadastrar(videogames);
        categoriaDao.cadastrar(informatica);

        produtoDao.cadastrar(celular);
        produtoDao.cadastrar(videogame);
        produtoDao.cadastrar(macbook);

        clienteDao.cadastrar(cliente);

        eManager.getTransaction().commit();
        eManager.close();
    }
}

Código PedidoDao

package br.com.alura.dao;

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

import javax.persistence.EntityManager;

import br.com.alura.Pedido;

public class PedidoDao {
    private EntityManager eManager;

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

    public void cadastrar(Pedido pedido) {
        this.eManager.persist(pedido);
    }
    public BigDecimal valorTotalVendido() {
        String jpql = "SELECT SUM(p.valorTotal) FROM Pedido p";
        return eManager.createQuery(jpql,BigDecimal.class).getSingleResult();
    }

    public List<Object[]> relatorioDeVendas() {
        String jpql = "SELECT 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 eManager.createQuery(jpql, Object[].class).getResultList();
    }
}
6 respostas

Oi Ana,

Muito estranho, pois o código está correto. Deve ser algum problema de compilação.

Confere no menu superior do Eclipse Project se a opção Build Automatically está marcada. E depois vá em: Project -> Clean para recompilar o projeto e teste novamente.

Olá Rodrigo

A opção Build Automatically está marcada sim e fiz o clean, mas mesmo assim não compilou. ![Erro que parece

Consegue compartilhar seu projeto? Pode ser via GitHub ou link compartilhado do google drive

O problema é uma restrição do banco de dados que você está utilizando, em relação ao modo que o hibernate gera essa consulta com group by e order by.

No MySQL é possível desabilitar a restrição com o comando: SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY','')); em outros bancos de dados vai ser necessário pesquisar.

Boa noite, uma outra solução mais simples é substituir o trecho + "GROUP By produto.nome " por + "GROUP By produto.nome, item.quantidade ".

Como o instrutor @Rodrigo Ferreira citou isso acontece por que alguns bancos de dados exigem que você acrescente todas as colunas ao qual é feita alguma manipulação. Como é ordenado por item.quantidade, ele exige que também seja incluído no group by.

Segue abaixo jpql completo:

String jpql = "SELECT produto.nome, "
                + "SUM(item.quantidade), "
                + "MAX(pedido.data) "
                + "FROM Pedido pedido "
                + "JOIN pedido.itens item "
                + "JOIN item.produto produto "
                + "GROUP By produto.nome, item.quantidade "
                + "ORDER By item.quantidade DESC";