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

Cheguei na parte em que realizo a consulta por agregação, no entanto, servidor local me lança a seguinte exceção

Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.math.BigDecimal.add(java.math.BigDecimal)" because "this.valorTotal" is null
    at br.com.mycompany.loja.modelo.Pedido.adicionarItem(Pedido.java:44)
    at br.com.mycompany.loja.main.Console.main(Console.java:37)
5 respostas

Oi!

Manda aqui o seu código completo das classes: Console e Pedido

Esta é a classe 'Console'

package br.com.mycompany.loja.main;

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

import javax.persistence.EntityManager;

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

public class Console {
    
    public static void main(String[] args) {
        cadastrarProduto();
        
        consul_list_Produto();
        
        EntityManager em = JPAUtil.getEntityManager();
        ProdutoDao produtoDao = new ProdutoDao(em);
        ClienteDao clienteDao = new ClienteDao(em);
        
        Produto produto = produtoDao.consultar(1l);
        Cliente cliente = clienteDao.consultar(1l);
        
        em.getTransaction().begin();
        
        Cliente cli = new Cliente("Vanessa", "12345678900");
        Pedido pedido = new Pedido(cli);
        pedido.adicionarItem(new ItemPedido(2, pedido, produto));
        
        PedidoDao pedidoDao = new PedidoDao(em);
        pedidoDao.cadastrarPedido(pedido);
        
        em.persist(pedidoDao);
        em.getTransaction().commit();
        
        BigDecimal valorTotalSoma = pedidoDao.valorTotalPedidos();
        System.out.println(valorTotalSoma);
        
        List<Object[]> relatorio = pedidoDao.relatorioVendas();
        for (Object[] obj : relatorio) {
            System.out.println(obj[0]);
            System.out.println(obj[1]);
            System.out.println(obj[2]);
        }
        
        
    }

    private static void consul_list_Produto() {
        EntityManager em = JPAUtil.getEntityManager();
        ProdutoDao produtoDao = new ProdutoDao(em);
        
        Produto p = produtoDao.consultar(1l);
        System.out.println(p.getPreco());
        
        List<Produto> produto = produtoDao.consultarProdutoPreco("Gocase");
        produto.forEach(p2 -> System.out.println(p2.getNome()));
    }

    private static void cadastrarProduto() {
        Categoria garrafaTermica = new Categoria("Garrafa térmica");
        Produto produto = new Produto("Gocase", "Garrafa térmica", new BigDecimal(200), garrafaTermica);
        
        EntityManager em = JPAUtil.getEntityManager();
        ProdutoDao produtoDao = new ProdutoDao(em);
        CategoriaDao categoriaDao = new CategoriaDao(em);
        
        em.getTransaction().begin();
        em.persist(garrafaTermica);
        garrafaTermica.setNome("Garrafa normal");
        em.flush();
        
        em.clear();
        
        garrafaTermica = em.merge(garrafaTermica);
        garrafaTermica.setNome("Garrafa térmica");
        em.flush();
    
        em.remove(garrafaTermica);
        em.clear();
    }
    
}
# 

E esta é a classe 'Pedido'

package br.com.mycompany.loja.modelo;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "pedidos")
public class Pedido {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private LocalDate data = LocalDate.now();
    @Column(name = "valor_total")
    private BigDecimal valorTotal;
    @ManyToOne
    private Cliente cliente;
    
    @OneToMany(mappedBy = "pedido", cascade = CascadeType.ALL)
    private List<ItemPedido> itens = new ArrayList<>();
    
    public Pedido() {
    }

    public Pedido(Cliente cliente) {
        this.cliente = cliente;
    }

    public void adicionarItem(ItemPedido item) {
        item.setPedido(this);
        this.itens.add(item);
        this.valorTotal = this.valorTotal.add(item.getValor());
    }
    
    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public LocalDate getData() {
        return data;
    }

    public void setData(LocalDate data) {
        this.data = data;
    }

    public BigDecimal getValorTotal() {
        return valorTotal;
    }

    public void setValorTotal(BigDecimal valorTotal) {
        this.valorTotal = valorTotal;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }
    
}
solução!

Na classe Pedido é necessário inicializar o atributo valorTotal com o valor zero:

private BigDecimal valorTotal = BigDecimal.ZERO;

Te agradeço pela resposta, professor! O erro foi corrigido ao implementar o código sugerido!