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

Como buscar os dados da lista do DTO

Possuo duas classes, Itens e Nota. Dentro da classe Nota possuo uma lista de itens. A dúvida é: Como eu busco os dados do DTO do que foi digitado na minha lista?

Isto porque eu preciso recuperar qual é o produto para pegar o seu valor unitário, multiplicar com a quantidade e assim pegar o valor total. Classe Nota:

@Entity(name = "Nota")
@Table(name = "nota")
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Nota {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_cliente")
    private Cliente cliente;

    @ManyToMany
    @JoinTable(name = "notas_itens",
            joinColumns = @JoinColumn(name = "id_nota"),
            inverseJoinColumns = @JoinColumn(name = "id_item"))
    private List<Itens> itens;

    private String numero;
    private LocalDate data;
    private BigDecimal valor_total;
    
    //getters e setters

NotaDTO:

public class NotaDTO {


    private Long id;
    private Long cliente;
    private List<Itens> itens;
    private LocalDate data;
    private BigDecimal valor_total;
    private String numero;

    public NotaDTO() {}
    
    //getters e setters

Classe Itens:

@Entity(name = "Itens")
@Table(name = "itens")
public class Itens {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "id_produto")
    private Produto produto;

    @ManyToMany(mappedBy = "itens")
    private List<Nota> notas;
    private int ordenacao;
    private BigDecimal quantidade;
    private BigDecimal valor_total;

//getters e setters

Debugando o código eu vejo que a lista esta bonitinha, a dúvida é somente como eu vou acessar estes valores:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

5 respostas

Olá Natali, tudo bem?

Para acessar os valores da lista de itens dentro da classe Nota, você pode percorrer a lista de itens e, para cada item, acessar o produto e o valor total do item. Por exemplo:

for(Itens item : nota.getItens()) {
    Produto produto = item.getProduto();
    BigDecimal valorTotalItem = item.getValor_total();
    // faça o que precisar com o produto e o valor total do item
}

Dessa forma, você pode recuperar o produto de cada item e, a partir dele, pegar o seu valor unitário e calcular o valor total do item. Espero ter ajudado e bons estudos!

Eu fui inserir os dados na lista porém da forma que fiz o valor do produto esta nulo. O que poderia estar acontecendo? O trecho do meu código onde trato a questão:

 int ordenacao = 0;
        BigDecimal somaTotal = null;
        BigDecimal valorItem = null;
        BigDecimal qtde = null;
        List<Itens> itens = new ArrayList<>();

        for (Itens item : dto.getItens()) {
            if (dto.getItens().indexOf(item) == 0) {
                ordenacao = 1;
            } else {
                ordenacao += 1;
            }

            Produto produto = item.getProduto();
            valorItem = produto.getValor_unitario();
            qtde = item.getQuantidade();

            valorItem = valorItem.multiply(qtde);
            somaTotal = somaTotal.add(valorItem);

            item.setValor_total(somaTotal);
            item.setOrdenacao(ordenacao);

            itens.add(item);
            System.out.println(itens);

        }

        nota = repository.save(nota);

        return nota;

O erro que recebi:

java.lang.NullPointerException: Cannot invoke "java.math.BigDecimal.multiply(java.math.BigDecimal)" because "valorItem" is null

Pelo erro, parece que quando você está tentando fazer a multiplicação, o big decimal está nulo.

Dá uma olhada se o valor do seu produto existe, parece que não tem e isso que está gerando o erro.

Eu tenho o valor na tabela dos produtos que estou adicionando: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

No debug realmente o meu valor esta vindo null: Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Estruturei o salvar conforme conversamos:

public Nota salvar(NotaDTO dto) {
        Nota nota = new Nota(dto);

        if (dto.getCliente() == null) {
            throw new ValidacaoException("É necessário informar um cliente .");
        }

        if (!clienteRepository.existsById(dto.getCliente())) {
            throw new ValidacaoException("O cliente informado não existe.");
        }

        Cliente cliente = clienteRepository.getReferenceById(dto.getCliente());

        Random random = new Random();
        int numeroAleatorio = random.nextInt();
        nota.setNumero(numeroAleatorio);

        int ordenacao = 1;
        BigDecimal somaTotal = BigDecimal.ZERO;

        for (Itens item : dto.getItens()) {
           item.setOrdenacao(ordenacao++);
           item.getProduto().getValor_unitario();
           item.setValor_total(item.getQuantidade().multiply(item.getProduto().getValor_unitario()));
           somaTotal = somaTotal.add(item.getValor_total());
        }

        nota.setValor_total(somaTotal);

        nota = repository.save(nota);

        return nota;
    }

Não consegui entender o porque de não buscar o valor do meu produto.

solução!

Resolvi o problema buscado via select o valor unitário do produto e assim funcionou. Ocódigo ficou da seguinte forma:

public Nota salvar(NotaDTO dto) {
        Nota nota = new Nota(dto);

        if (dto.getCliente() == null) {
            throw new ValidacaoException("É necessário informar um cliente .");
        }

        if (!clienteRepository.existsById(dto.getCliente().getId())) {
            throw new ValidacaoException("O cliente informado não existe.");
        }

        Cliente cliente = clienteRepository.getReferenceById(dto.getCliente().getId());

        Random random = new Random();
        int numeroAleatorio = random.nextInt();
        nota.setNumero(numeroAleatorio);

        int ordenacao = 1;
        BigDecimal somaTotal = BigDecimal.ZERO;

        for (Itens item : dto.getItens()) {
           item.setOrdenacao(ordenacao++);

            Long valor = item.getProduto().getId();  //Aqui é onde guardo o valor do id do produto que esta sendo adicionado
            Long valorUnitario = produtoRepository.findByValorUnitarioProduto(valor); //aqui eu busco o valor unitário do produto de acordo com o id

           item.setValor_total(item.getQuantidade().multiply(BigDecimal.valueOf(valorUnitario)));
           somaTotal = somaTotal.add(item.getValor_total());
        }

        nota.setValor_total(somaTotal);

        nota = repository.save(nota);

        return nota;
    }

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