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

[Dúvida] Como comparar dois valores entre duas lista e excluir o que não existe

Estudando listas, me deparei com a seguinte situação que me travou. Possuo a entidade e o DTO e ambos possuem uma lista de itens: Nota:

    @JsonManagedReference
    @OneToMany(fetch = FetchType.EAGER, mappedBy = "nota", cascade = CascadeType.PERSIST)
    private List<Itens> itens;

Itens:

    @JsonBackReference
    @ManyToOne(fetch = FetchType.LAZY)
    private Nota nota;

NotaDto:

public class NotaDTO {

    private List<Itens> itens;

Além disso possuo um respository onde eu busco a lista de todos os itens que ja existem na nota:

   @Query("select i from Itens i where nota = :id")
    List<Itens> findAllByIdItens(Nota id);

Eu quero atualizar essa lista do meu banco de dados de forma que compare os itens se ja existem ou não com o que eu recebo do DTO. Caso existir somente atualizo algumas informações, caso não exista no DTO eu irei excluir do banco de dados. Seria algo assim:

 public void atualizar(NotaDTO dto) {
        Nota nota = repository.getReferenceById(dto.getId());
        List<Itens> list = itensRepository.findAllByIdItens(nota);
        
        for (Itens item : dto.getItens()) {
               if (list == dto.getItens()) {
                   //Apenas vou atualizar os valores dos itens (como a quantidade por exemplo)
               } else {
                  //Como ele não existe (supondo que o usuário removeu o item) quero excluir do do banco de dados
                  itensrepository.deleteById(item.getId());
               }
           }
    }

A título de informação, o JSON que é o meu DTO estou enviando assim:

{
    "id": 15,
      "itens":[
        {
                        "id": 45,
                      "produto": 1,
            "quantidade": 2
        },
             {
                        "id": 46,
                      "produto": 2,
            "quantidade": 2
        },
        {
                        "id": 47,
            "produto": 3,
            "quantidade": 1
            }
        ]
}

O que possuo no banco de dados esta assim:

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

No caso eu quero excluir do banco de dados o item de ID 48.

2 respostas

Montei a seguinte estrutura:

 public void atualizar(NotaDTO dto) {
        Nota nota = repository.getReferenceById(dto.getId());

        if (!repository.existsById(dto.getId())) {
            throw new ValidacaoException("A nota fiscal informada não existe.");
        } else {
            BigDecimal somaTotal = BigDecimal.ZERO;
            List<Itens> list = itensRepository.findAllByIdItens(nota); //Lista com valores recebidos do banco de dados 
            List<Itens> listaFinal = new ArrayList<>(); //Lista que vou adicionar onde encontro os id's iguais.

            for (Itens item : list) {
                if (dto.getItens().contains(item)) {
                    listaFinal.add(item);
                    System.out.println("Adicionando " + item.getId());
                }
                if (!dto.getItens().contains(item)) {
                    itensRepository.deleteById(item.getId());
                }
            }

        }
    }

Porém esta sendo reconhecendo por algum motivo que todos os itens comparando com o banco de dados não existem, e no fim acaba excluindo todos eles. Por qual motivo isso acontece?

solução!

Olá Natali, tudo bem?

Uma forma de fazer isso é percorrer a lista de itens existentes no banco de dados e verificar se cada item está presente no DTO. Se estiver, você atualiza as informações necessárias. Caso contrário, você exclui o item do banco de dados.

No seu código, você está comparando a lista completa de itens existentes com a lista de itens do DTO usando o operador de igualdade (==). No entanto, isso não irá funcionar corretamente, pois você está comparando as referências das listas, e não os itens em si.

Uma abordagem correta seria percorrer a lista de itens existentes e verificar se cada item está presente no DTO utilizando um identificador único, como o ID. Se o item não estiver presente no DTO, você pode excluí-lo do banco de dados.

Aqui está uma possível solução para o seu problema:

public void atualizar(NotaDTO dto) {
    Nota nota = repository.getReferenceById(dto.getId());
    List<Itens> list = itensRepository.findAllByIdItens(nota);

    for (Itens item : list) {
        boolean itemExisteNoDTO = false;
        for (Itens itemDTO : dto.getItens()) {
            if (item.getId() == itemDTO.getId()) {
                // O item existe no DTO, então atualize as informações necessárias
                // (como a quantidade, por exemplo)
                item.setQuantidade(itemDTO.getQuantidade());
                itemExisteNoDTO = true;
                break;
            }
        }

        if (!itemExisteNoDTO) {
            // O item não existe no DTO, então exclua-o do banco de dados
            itensRepository.deleteById(item.getId());
        }
    }
}

Dessa forma, você percorre a lista de itens existentes no banco de dados e verifica se cada item está presente no DTO. Se estiver, você atualiza as informações necessárias. Caso contrário, você exclui o item do banco de dados.

Espero ter ajudado e bons estudos!