Qual seria a forma correta de percorrer a lista e retornar os dados?

41 respostas
javaprogramação
P

boa tarde. por estar iniciando, não consegui compreender como irei setar a “Pessoa” e retornar ela na lista “Pedido” …

public List<Pedido> findById(Long idCliente) throws SQLException {
        try (PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedido WHERE idCliente = ?")) {
        	psmt.setLong(1, idCliente); // parâmetro da query
        	
        	Pessoa pessoa = new Pessoa();
        	pessoa.setId(1);
        	
            try (ResultSet rs = psmt.executeQuery()) {
                final List<Pedido> pedidos = new ArrayList<>();
                while (rs.next()) {
                    final Pedido pedido = new Pedido()
                            .setId(rs.getLong("id"))
                            .setPessoa(pessoa);
                    pedidos.add(pedido);
                }
                return pedidos;
            }
        }
    }

desta forma não esta retornando os dados da Pessoa.

41 Respostas

TerraSkilll

Da mesma forma que você tem esse findById() para busca os dados do pedido, eu imagino que você tenha um método pra chamar o cliente, certo? Seria o caso de usá-lo da mesma forma:

public List<Pedido> findById(Long idCliente) throws SQLException {
        try (PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedido WHERE idCliente = ?")) {
        	psmt.setLong(1, idCliente); // parâmetro da query

        	Pessoa pessoa = ClienteRepository.findById(idCliente); // retorna o cliente pelo id

ou mesmo passar o cliente já preenchido para esse método que busca os pedidos. Algo como:

// O parâmetro é alterado para uma instância de Pessoa/Cliente
public List<Pedido> findById(Pessoa pessoa) throws SQLException {
        try (PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedido WHERE idCliente = ?")) {
        	psmt.setLong(1, pessoa.getId()); // parâmetro da query

              // o Pessoa pessoa = new Pessoa(); é totalmente removido, já que já está preenchido.

Abraço.

P

Obrigado pela resposta;

Neste exemplo em questão, não utilizo Repository, é utilizado DAO.

E no caso, eu tenho a entidade Pedido e Pessoa.

Na classe pedido, tenho minha classe pessoa desta forma: private Pessoa pessoa;

ao retornar a lista, teria que entender que tal pedido seria de tal pessoa… não sei se consegui ser mt claro.

staroski

Então você vai ter que primeiro fazer um select na tabela de Pessoa para encontrar a pessoa com o mesmo id do idPessoa no pedido.
Depois seta a pessoa encontrada no objeto Pedido que você está montando.

P

montei a query em PessoaDAO:

public Pessoa findById(Long id) throws SQLException {
        try (PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pessoa WHERE id = ?")) {
            try (ResultSet rs = psmt.executeQuery()) {
            	psmt.setLong(1, id); // parâmetro da query
            	
                   Pessoa pessoa = new Pessoa()
                            .setId(rs.getLong("id"))
                            .setNome(rs.getString("nome"))
                            .setCpf(rs.getString("cpf"));
                   
                
                return pessoa;
            }
        }
    }

porém não estou sabendo como implementar corretamente na classe PedidoDAO, para montar a lista :confused:

staroski
Pessoa pessoa = pessoaDao.findById(idCliente);
P

fiz desta forma,

PedidoDAO:

public class PedidoDAO extends DAO {
	
	PessoaDAO pessoaDao;

    public PedidoDAO(final Connection connection) {
        super(connection);
    }
    
    public List<Pedido> findById(Long idCliente) throws SQLException {
        try (PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedido WHERE idCliente = ?")) {
        	psmt.setLong(1, idCliente); // parâmetro da query
        	
        	Pessoa pessoa = pessoaDao.findById(idCliente);
        	
            try (ResultSet rs = psmt.executeQuery()) {
                final List<Pedido> pedidos = new ArrayList<>();
                while (rs.next()) {
                    final Pedido pedido = new Pedido()
                            .setId(rs.getLong("id"))
                            .setPessoa(pessoa);
                            //.setItens(pedidosItem);
                    pedidos.add(pedido);
                }
                return pedidos;
            }
        }
    }
}

PessoaDAO:

public class PessoaDAO extends DAO {

    public PessoaDAO(final Connection connection) {
        super(connection);
    }

    
    public Pessoa findById(Long id) throws SQLException {
        try (PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pessoa WHERE id = ?")) {
            try (ResultSet rs = psmt.executeQuery()) {
            	psmt.setLong(1, id); // parâmetro da query
            	
                final Pessoa pessoa = new Pessoa()
                            .setId(rs.getLong("id"))
                            .setNome(rs.getString("nome"))
                            .setCpf(rs.getString("cpf"));
                
                return pessoa;
            }
        }
    }
}

porém me retorna o erro:
Cannot invoke "br.com.desafio.desafio.dao.PessoaDAO.findById(java.lang.Long)" because "this.pessoaDao" is null

staroski

A mensagem está bem clara, você não inicializou o atributo pessoaDao.

P

entendo… é que no caso tentei:
PessoaDAO pessoaDao = new PessoaDAO();

porém como a classe pede os argumentos de conexão, não sei como seria a forma correta de implementar… comecei a mexer agora com este padrão DAO, e ainda estou um pouco confuso :confused:

staroski

Como é que você instância o PedidoDao?
Vai ser da mesma forma.

P

sim, pensei desta forma tbm…

public PedidoDAO(final Connection connection) {
        super(connection);
    }
    
    public PessoaDAO(final Connection connection) {
        super(connection);
    }

Porém no PessoaDAO, me gerou: “Constructor call must be the first statement in a constructor” … estou pesquisando mas não encontro o motivo

staroski

Pôxa, você está tentando declarar o construtor da classe PessoaDAO dentro da classe PedidoDAO.

Seu PedidoDAO vai ter um atributo do tipo PessoaDAO.

No construtor você inicializa o atributo.

class PedidoDAO {

    private final PessoaDAO pessoaDao;

    public PedidoDAO(final Connection connection) {
        super(connection);
        this.pessoaDao = new PessoaDAO(connection);
    }
}
P

que mancada, não me atentei nisso… vou fazer os testes assim que possível.

P

bom dia!

gostaria de agradecer sua ajuda!! consegui retornar a lista de clientes deste pedido.

porém agora preciso retornar uma lista com os itens deste pedido. Pelo que entendi, terei que retornar uma lista de PedidoItem, exemplo:

SELECT * FROM pedidoItem WHERE idPedido = ?

em PedidoItem estão as classes:

private Produto produto;
 private Pedido pedido;

porém não vejo uma forma de fazer isto pois são parâmetros diferentes, e é enviado apenas 1 na URL.

P

Em PedidoItemDAO fiz o seguinte:

public List<PedidoItem> findByPedido() throws SQLException {
        try (PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedidoItem pe LEFT JOIN pedido p ON pe.id = p.id")) {
            try (ResultSet rs = psmt.executeQuery()) {
                final List<PedidoItem> itensPedido = new ArrayList<>();
                while (rs.next()) {
                    final PedidoItem item = new PedidoItem()
                            .setId(rs.getLong("id"))
                            //.setProduto(null)
                            .setQuantidade(rs.getInt("qntd"));
                            //.setPedido(null);                           
                    itensPedido.add(item);
                }
                return itensPedido;
            }
        }
    }

aparentemente esta retornando correto, oq resta é setar o Produto e Pedido de acordo

TerraSkilll

Se a tabela de PedidoItem tem uma coluna para o id do pedido, você não precisa desse left join, pode fazer o select direto na tabela de pedidoItem. Também está faltando um parâmetro para definir de qual pedido você quer carregar. Da forma como está, está carregando todos os itens de todos os pedidos.

Se a ideia desse método é carregar os itens de um pedido que você já tem carregado, eu somente passaria a instância dele para o método, em vez de ter o trabalho de carregar de novo. E, para os dados do produto, você precisa de um DAO pra carregá-lo, da mesma forma que já vem fazendo. Algo como:

public List<PedidoItem> findByPedido(Pedido pedido) throws SQLException {
    List<PedidoItem> itensPedido = new ArrayList<>();
    ProdutoDAO produtoDao = new ProdutoDAO(getConnection()); // dao de consulta a produtos, similar aos demais

    PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedidoItem pe WHERE pe.id = ?");
    psmt.setLong(1, pedido.getId());
    try (ResultSet rs = psmt.executeQuery()) {
        while (rs.next()) {
            final PedidoItem item = new PedidoItem()
                    .setId(rs.getLong("id"))
                    .setProduto(produtoDao.findById(rs.getLong("id_produto"))) // usa o dao de produto pra buscar o produto pelo id_produto da tabela pedido_item
                    .setQuantidade(rs.getInt("qntd"));
                    .setPedido(pedido); // usa o pedido

            itensPedido.add(item);
        }
    }

    return itensPedido;
}

Abraço.

P

muito obrigado!

acho que consegui compreender oq disse… porém não estou sabendo ao certo, como vou instanciar o Pedido corretamente :confused:

P

no caso, esta lista que fiz, é para retornar todos os itens do pedido, pois nesta consulta tenho o idProduto… e a cada vez que passar no while, cria um novo produto, para setar ele na lista.

public List<PedidoItem> findByPedido() throws SQLException {
        try (PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedidoItem pi LEFT JOIN pedido p ON pi.id = p.id")) {
            try (ResultSet rs = psmt.executeQuery()) {
                final List<PedidoItem> itensPedido = new ArrayList<>();
                while (rs.next()) {
                	Produto produto = produtoDao.findById(rs.getLong("idProduto"));

                    final PedidoItem item = new PedidoItem()
                            .setId(rs.getLong("id"))
                            .setProduto(produto)
                            .setQuantidade(rs.getInt("qntd"));
                            //.setPedido(null);                           
                    itensPedido.add(item);
                }
                return itensPedido;
            }
        }
    }
staroski

Não é o seu PedidoDAO quem carrega os pedidos do banco?
É só você usar seu PesidoDAO para obter o pedido e passar ele como parâmetro como o @TerraSkilll ensinou.

P

Em PedidoDAO, carrego uma lista com todos os pedidos e todos os pedidos por idCliente, terei que criar um que retorne somente o pedido específico?

PedidoDAO até o momento:

public List<Pedido> findAll() throws SQLException {
        try (PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedido")) {
            try (ResultSet rs = psmt.executeQuery()) {
                final List<Pedido> pedidos = new ArrayList<>();
                while (rs.next()) {
                    final Pedido pedido = new Pedido()
                            .setId(rs.getLong("id"));
                    pedidos.add(pedido);
                }
                return pedidos;
            }
        }
    }
    
    public List<Pedido> findByIdCliente(Long idCliente) throws SQLException {
        try (PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedido WHERE idCliente = ?")) {
        	psmt.clearParameters();
        	psmt.setLong(1, idCliente); // parâmetro da query
        	
        	Pessoa pessoa = pessoaDao.findById(idCliente);
        	List<PedidoItem> itensPedido = pedidoItemDao.findByPedido();
        	
            try (ResultSet rs = psmt.executeQuery()) {
                final List<Pedido> pedidos = new ArrayList<>();
                while (rs.next()) {
                    final Pedido pedido = new Pedido()
                            .setId(rs.getLong("id"))
                            .setPessoa(pessoa)
                            .setItens(itensPedido);
                    pedidos.add(pedido);
                }
                return pedidos;
            }
        }
    }
P

Em PedidoDAO preciso do seguinte:

public List<Pedido> findByIdCliente(Long idCliente) throws SQLException {
        try (PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedido WHERE idCliente = ?")) {
        	psmt.clearParameters();
        	psmt.setLong(1, idCliente); // parâmetro da query
        	
        	Pessoa pessoa = pessoaDao.findById(idCliente);
        	List<PedidoItem> itensPedido = pedidoItemDao.findByPedido(); // consulta do PedidoItemDAO
        	
            try (ResultSet rs = psmt.executeQuery()) {
                final List<Pedido> pedidos = new ArrayList<>();
                while (rs.next()) {
                    final Pedido pedido = new Pedido()
                            .setId(rs.getLong("id"))
                            .setPessoa(pessoa)
                            .setItens(itensPedido);
                    pedidos.add(pedido);
                }
                return pedidos;
            }
        }
    }

devido a eu precisar de uma lista dos itens do Pedido, montei a consulta citada acima.

staroski

Essa consulta me parece errada!

Se o método se chama findByPedido, você deveria passar o pedido como parâmetro para ele trazer os itens daquele pedido, como o @TerraSkilll já explicou lá em cima, pôxa, tem que prestar atenção no que os coleguinhas te passam no fórum.

Depois que você arrumar o método pra receber o pedido como parâmetro, provavelmente seu código vai ficar mais ou menos assim:

public List<Pedido> findByIdCliente(Long idCliente) throws SQLException {
    try (PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedido WHERE idCliente = ?")) {
    	psmt.clearParameters();
    	psmt.setLong(1, idCliente); // parâmetro da query
    	
    	Pessoa pessoa = pessoaDao.findById(idCliente);
    	
        try (ResultSet rs = psmt.executeQuery()) {
            final List<Pedido> pedidos = new ArrayList<>();
            while (rs.next()) {
                final Pedido pedido = new Pedido()
                        .setId(rs.getLong("id"))
                        .setPessoa(pessoa);

                final List<PedidoItem> itensPedido = pedidoItemDao.findByPedido(pedido); // consulta do PedidoItemDAO
                pedido.setItens(itensPedido);

                pedidos.add(pedido);
            }
            return pedidos;
        }
    }
}
P

sim, concordo, estou prestando bem atenção, porém como migrei do Delphi para o Java, muitas coisas ainda são confusas, e vou aprendendo no dia a dia… e oq realmente não estou conseguindo é fazer o método receber o pedido como parâmetro… mas irei tentar fazer as alterações.

P

Foi necessário passar o Pedido como parâmetro no Service e Controller;

E meu PedidoDAO fiz desta forma:

public List<Pedido> findByIdCliente(Long idCliente, Pedido pedido) throws SQLException {
        try (PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedido WHERE idCliente = ?")) {
        	psmt.clearParameters();
        	psmt.setLong(1, idCliente); // parâmetro da query
        	
        	Pessoa pessoa = pessoaDao.findById(idCliente);
        	//List<PedidoItem> itensPedido = pedidoItemDao.findByPedido();
        	
            try (ResultSet rs = psmt.executeQuery()) {
                final List<Pedido> pedidos = new ArrayList<>();
                while (rs.next()) {
                    //final Pedido pedido = new Pedido()
                	pedido.setId(rs.getLong("id"));
                	pedido.setPessoa(pessoa);
                    
                    final List<PedidoItem> itensPedido = pedidoItemDao.findByPedido(pedido); // consulta do PedidoItemDAO
                    		pedido.setItens(itensPedido);
                    		
                    pedidos.add(pedido);
                }
                return pedidos;
            }
        }
    }

porém tenho um retorno estranho,
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728)

pesquisei sobre este erro, mas até o momento não consegui localizar o motivo.

Lucas_Camara

Não acho que vc precisaria passar o Pedido como parâmetro da forma como vc fez. Se a ideia é recuperar todos os pedidos de um determinado cliente, apenas o ID do cliente é necessário.

Tentei refazer esse método de uma forma que faz mais sentido pra mim, de acordo com o que to entendendo do seu código:

public List<Pedido> findPedidosByIdCliente(Long idCliente) throws SQLException {
    try (
        PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedido WHERE idCliente = ?");
        ResultSet rs = psmt.executeQuery()
    ) {
        // Recupera o cliente pelo ID
        psmt.setLong(1, idCliente);
        Pessoa pessoa = pessoaDao.findById(idCliente);
        
        // Lista de pedidos do cliente
        List<Pedido> pedidos = new ArrayList<>();

        while (rs.next()) {
            Pedido pedido = new Pedido();
            pedido.setId(rs.getLong("id"));
            pedido.setPessoa(pessoa);

            // Recupera os itens do pedido
            List<PedidoItem> itensPedido = pedidoItemDao.findByPedido(pedido);
            pedido.setItens(itensPedido);
            
            pedidos.add(pedido);
        }
        
        return pedidos;
    }
}

Posta como que está o método findByPedido da classe PedidoItemDao pra gente ver.

P

opa, boa noite!

public List<PedidoItem> findByPedido(Pedido pedido) throws SQLException {
        List<PedidoItem> itensPedido = new ArrayList<>();
        ProdutoDAO produtoDao = new ProdutoDAO(getConnection());

        PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedidoItem WHERE id = ?");
        psmt.setLong(1, pedido.getId());
        try (ResultSet rs = psmt.executeQuery()) {
            while (rs.next()) {
                final PedidoItem item = new PedidoItem()
                        .setId(rs.getLong("id"))
                        .setProduto(produtoDao.findById(rs.getLong("idProduto"))) // usa o dao de produto pra buscar o produto pelo idProduto da tabela PedidoItem
                        .setQuantidade(rs.getInt("qntd"))
                        .setPedido(pedido); // usa o pedido

                itensPedido.add(item);
            }
        }

        return itensPedido;
    }
P

qndo eu estava testando sem parâmetros:

PedidoItemDAO:

public List<PedidoItem> findByPedido() throws SQLException {
        try (PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedidoItem pi LEFT JOIN pedido p ON pi.id = p.id")) {
            try (ResultSet rs = psmt.executeQuery()) {
                final List<PedidoItem> itensPedido = new ArrayList<>();
                while (rs.next()) {
                	Produto produto = produtoDao.findById(rs.getLong("idProduto"));
                	
                    final PedidoItem item = new PedidoItem()
                            .setId(rs.getLong("id"))
                            .setProduto(produto)
                            .setQuantidade(rs.getInt("qntd"));
                            //.setPedido(pedido);                           
                    itensPedido.add(item);
                }
                return itensPedido;
            }
        }
    }

PedidoDAO:

public List<Pedido> findByIdCliente(Long idCliente) throws SQLException {
        try (PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedido WHERE idCliente = ?")) {
        	psmt.clearParameters();
        	psmt.setLong(1, idCliente); // parâmetro da query
        	
        	Pessoa pessoa = pessoaDao.findById(idCliente);
        	List<PedidoItem> itensPedido = pedidoItemDao.findByPedido();
        	
            try (ResultSet rs = psmt.executeQuery()) {
                final List<Pedido> pedidos = new ArrayList<>();
                while (rs.next()) {
                    final Pedido pedido = new Pedido()
                            .setId(rs.getLong("id"))
                            .setPessoa(pessoa)
                            .setItens(itensPedido);
                    pedidos.add(pedido);
                }
                return pedidos;
            }
        }
    }
Lucas_Camara

E do jeito que tá agora, tah funcionando?

P

é que no caso, como o colega explicou acima, em PedidoItemDAO, eu tenho uma consulta por pedido e teria que ficar assim:

public List<PedidoItem> findByPedido(Pedido pedido) throws SQLException {
    List<PedidoItem> itensPedido = new ArrayList<>();
    ProdutoDAO produtoDao = new ProdutoDAO(getConnection()); // dao de consulta a produtos, similar aos demais

    PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedidoItem pe WHERE pe.id = ?");
    psmt.setLong(1, pedido.getId());
    try (ResultSet rs = psmt.executeQuery()) {
        while (rs.next()) {
            final PedidoItem item = new PedidoItem()
                    .setId(rs.getLong("id"))
                    .setProduto(produtoDao.findById(rs.getLong("id_produto"))) // usa o dao de produto pra buscar o produto pelo id_produto da tabela pedido_item
                    .setQuantidade(rs.getInt("qntd"));
                    .setPedido(pedido); // usa o pedido

            itensPedido.add(item);
        }
    }

    return itensPedido;
}

porém eu nao estou sabendo instanciar o pedido, para receber a ID e setar ela como parâmetro na query :confused:

Lucas_Camara

Mas vc já está fazendo isso aqui. Nessa parte vc recupera os pedidos do banco e cria o Pedido com o ID setado. Depois disso, só chamar o método que recupera os itens. Não é isso?

P

posso estar me perdendo em alguma parte… vou analisar melhor e tentar implementar

P

Tentei desta forma:

PedidoDAO:

public List<Pedido> findPedidosByIdCliente(Long idCliente) throws SQLException {
		try (PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedido WHERE idCliente = ?")) {
			// Recupera o cliente pelo ID
			psmt.setLong(1, idCliente);
			
			try (ResultSet rs = psmt.executeQuery()) {
				Pessoa pessoa = pessoaDao.findById(idCliente);

				// Lista de pedidos do cliente
				List<Pedido> pedidos = new ArrayList<>();

				while (rs.next()) {
					Pedido pedido = new Pedido();
					pedido.setId(rs.getLong("id"));
					pedido.setPessoa(pessoa);

					// Recupera os itens do pedido
					List<PedidoItem> itensPedido = pedidoItemDao.findByPedido(pedido);
					pedido.setItens(itensPedido);

					pedidos.add(pedido);
				}

				return pedidos;
			}
		}
	}

PedidoItemDAO:

public List<PedidoItem> findByPedido(Pedido pedido) throws SQLException {
        List<PedidoItem> itensPedido = new ArrayList<>();
        ProdutoDAO produtoDao = new ProdutoDAO(getConnection());

        PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedidoItem WHERE id = ?");
        psmt.setLong(1, pedido.getId());
        try (ResultSet rs = psmt.executeQuery()) {
            while (rs.next()) {
                final PedidoItem item = new PedidoItem()
                        .setId(rs.getLong("id"))
                        .setProduto(produtoDao.findById(rs.getLong("idProduto")))
                        .setQuantidade(rs.getInt("qntd"))
                        .setPedido(pedido); // usa o pedido

                itensPedido.add(item);
            }
        }

        return itensPedido;
    }

porém me retorna:

at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:774)
Cannot render error page for request [/pedidos/listar/1] as the response has already been committed. As a result, the response may have the wrong status code.
staroski

É só fazer como eu postei lá em cima:

public List<Pedido> findByIdCliente(Long idCliente) throws SQLException {
    try (PreparedStatement psmt = getConnection().prepareStatement("SELECT * FROM pedido WHERE idCliente = ?")) {
    	psmt.clearParameters();
    	psmt.setLong(1, idCliente); // parâmetro da query
    	
    	Pessoa pessoa = pessoaDao.findById(idCliente);
    	
        try (ResultSet rs = psmt.executeQuery()) {
            final List<Pedido> pedidos = new ArrayList<>();
            while (rs.next()) {
                // instanciando o pedido
                final Pedido pedido = new Pedido()
                        .setId(rs.getLong("id"))
                        .setPessoa(pessoa);

                // carregando os itens do pedido
                final List<PedidoItem> itensPedido = pedidoItemDao.findByPedido(pedido); // consulta do PedidoItemDAO

                // setando os itens no pedido
                pedido.setItens(itensPedido);

                // adicionando o pedido na lista
                pedidos.add(pedido);
            }
            return pedidos;
        }
    }
}
staroski

Tá, mas esse erro aí não é nas suas consultas, em que momento que acontece esse erro?

P

esse retorno é quando bate no endpoint para listar por cliente. estou trabalhando só no backend e testando via localhost:8080…

Lucas_Camara

Pode ser erro de referência circular, pois há um Pedido no PedidoItem e uma lista de PedidoItem no Pedido. Com isso, ao serializar pra json, dá problema. Faça um teste deixando o Pedido de cada PedidoItem como null e veja o que acontece.

P

limpei a tabela PedidoItem, e realmente, o erro não ocorreu.

Lucas_Camara

Repare que não é deixar null no banco, mas sim na hora de criar as instâncias no código da aplicação.

P

dsclp o engano…

alterei para:
pedido.setItens(null);

e o erro não ocorreu tbm;

wallacecampanha

Saudações meu querido!

Você precisa abrir o Objeto PEDIDO antes ou depois de iniciar o WHILE, se nao vc estará abrindo um novo objeto pedido enquanto estiver rodando o WHILE.

Dentro do while, armazene os dados recebidos do banco em variáveis declaradas anteriormente.

Depois insira as variáveis no Objeto PEDIDO.

P

mt obrigado pela ajuda!!

tentei pensar em algo para implementar desta forma, mas ainda não surgiu a ideia… seguirei tentando :sweat_smile:

wallacecampanha

Meu amigo, esse vídeo explica de uma forma melhor, utilizando o for.
De uma olhada e nos responda se deu certo.

Criado 12 de dezembro de 2022
Ultima resposta 14 de dez. de 2022
Respostas 41
Participantes 5