Listar do BD [RESOLVIDO]

9 respostas
Maureli

Estou com um problema em listar os dados do meu BD

Quando fiz a depuração, percebi que ele passa muitas vezes pela mesma linha, depois vais para próxima.

E na hora de imprimir a lista ele só imprime a última linha do BD.

ArrayList lista = new ArrayList();
            PreparedStatement stmt = listar.prepareStatement("select * from box,cliente,endereco");
            
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                cliente.setId(rs.getInt("id_cliente"));
                cliente.setNome(rs.getString("nome"));
                cliente.setCpf(rs.getLong("cpf"));

                endereco.setId(rs.getInt("id_endereco"));
                endereco.setNumero(rs.getInt("numero"));
                endereco.setRua(rs.getString("rua"));
                endereco.setComplemento(rs.getString("complemento"));
                cliente.setEndereco(endereco);


                box1.setId(rs.getInt("id_box"));
                box1.setNumero(rs.getInt("numero"));
                box1.setVago(rs.getBoolean("vago"));
                box1.setCliente(cliente);

                lista.add(box1);
                
                
            }
            return lista;

9 Respostas

rfsilva
Maureli:
Estou com um problema em listar os dados do meu BD

Quando fiz a depuração, percebi que ele passa muitas vezes pela mesma linha, depois vais para próxima.

E na hora de imprimir a lista ele só imprime a última linha do BD.

ArrayList lista = new ArrayList();
            PreparedStatement stmt = listar.prepareStatement("select * from box,cliente,endereco");
            
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                cliente.setId(rs.getInt("id_cliente"));
                cliente.setNome(rs.getString("nome"));
                cliente.setCpf(rs.getLong("cpf"));

                endereco.setId(rs.getInt("id_endereco"));
                endereco.setNumero(rs.getInt("numero"));
                endereco.setRua(rs.getString("rua"));
                endereco.setComplemento(rs.getString("complemento"));
                cliente.setEndereco(endereco);


                box1.setId(rs.getInt("id_box"));
                box1.setNumero(rs.getInt("numero"));
                box1.setVago(rs.getBoolean("vago"));
                box1.setCliente(cliente);

                lista.add(box1);
                
                
            }
            return lista;

Maureli,

Você precisa instanciar (new) os objetos cliente, endereco e box1 dentro do loop for, para que a listagem sempre guarde objetos novos. Do jeito que você está fazendo, ele está sempre acumulando o mesmo objeto na lista, por isso a única linha de resultado impressa.

Maureli

Esqueci de postar a clesse toda, eu fiz as instancias no inicio.

public class JDBCListar {

    public ArrayList listar(Box box){
        Connection listar = PostgreSQL.getConnection();
        Cliente cliente = new Cliente();
        Endereco endereco = new Endereco();
        Box box1 = new Box();

        try {

            ArrayList lista = new ArrayList();
            PreparedStatement stmt = listar.prepareStatement("select * from box,cliente,endereco");
            
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                cliente.setId(rs.getInt("id_cliente"));
                cliente.setNome(rs.getString("nome"));
                cliente.setCpf(rs.getLong("cpf"));

                endereco.setId(rs.getInt("id_endereco"));
                endereco.setNumero(rs.getInt("numero"));
                endereco.setRua(rs.getString("rua"));
                endereco.setComplemento(rs.getString("complemento"));
                cliente.setEndereco(endereco);


                box1.setId(rs.getInt("id_box"));
                box1.setNumero(rs.getInt("numero"));
                box1.setVago(rs.getBoolean("vago"));
                box1.setCliente(cliente);

                lista.add(box1);
                
                
            }
            return lista;

        } catch (SQLException e) {
            System.out.print("Erro ao realizar a listagem " + e.getMessage());
            return null;
        }

    }
}
rfsilva
Maureli:
Esqueci de postar a clesse toda, eu fiz as instancias no inicio.
public class JDBCListar {

    public ArrayList listar(Box box){
        Connection listar = PostgreSQL.getConnection();
        Cliente cliente = new Cliente();
        Endereco endereco = new Endereco();
        Box box1 = new Box();

        try {

            ArrayList lista = new ArrayList();
            PreparedStatement stmt = listar.prepareStatement("select * from box,cliente,endereco");
            
            ResultSet rs = stmt.executeQuery();
            while (rs.next()) {
                cliente.setId(rs.getInt("id_cliente"));
                cliente.setNome(rs.getString("nome"));
                cliente.setCpf(rs.getLong("cpf"));

                endereco.setId(rs.getInt("id_endereco"));
                endereco.setNumero(rs.getInt("numero"));
                endereco.setRua(rs.getString("rua"));
                endereco.setComplemento(rs.getString("complemento"));
                cliente.setEndereco(endereco);


                box1.setId(rs.getInt("id_box"));
                box1.setNumero(rs.getInt("numero"));
                box1.setVago(rs.getBoolean("vago"));
                box1.setCliente(cliente);

                lista.add(box1);
                
                
            }
            return lista;

        } catch (SQLException e) {
            System.out.print("Erro ao realizar a listagem " + e.getMessage());
            return null;
        }

    }
}

Sim, eu imaginei. Esse é o problema. As instâncias devem ser feitas dentro do loop:

while (rs.next()) {
                //Instancias novas aqui
                Cliente cliente = new Cliente();
                Endereco endereco = new Endereco();
                Box box1 = new Box();

                cliente.setId(rs.getInt("id_cliente"));
                cliente.setNome(rs.getString("nome"));
                cliente.setCpf(rs.getLong("cpf"));

                endereco.setId(rs.getInt("id_endereco"));
                endereco.setNumero(rs.getInt("numero"));
                endereco.setRua(rs.getString("rua"));
                endereco.setComplemento(rs.getString("complemento"));
                cliente.setEndereco(endereco);


                box1.setId(rs.getInt("id_box"));
                box1.setNumero(rs.getInt("numero"));
                box1.setVago(rs.getBoolean("vago"));
                box1.setCliente(cliente);

                lista.add(box1);
                
                
            }
Maureli

Obrigado mestre, estou quase lá.

Agora consigo listar todas as linhas do BD.

o problema agora é que ele lista 9 vezes a mesma linha, e depois passa para a próxima.

rfsilva

Maureli:
Obrigado mestre, estou quase lá.

Agora consigo listar todas as linhas do BD.

o problema agora é que ele lista 9 vezes a mesma linha, e depois passa para a próxima.

Maureli, o problema agora é na consulta. Você precisa “amarrar” as tabelas. Do jeito que você fez, ele vai multiplicar os registros das tabelas, pois não há where clause que amarre os campos. Pro exemplo:

select * from box,cliente,endereco

box tem 3 registros
cliente tem 4 registros
endereco tem 4 registros

O resultado vai ser 443 = 48 registros

Defina a where clause que amarre as chaves, e o resultado será o que você provavelmente está esperando

Abraços!

Maureli

Estou fazendo várias combinações aqui, e o erro realmente está na consulta SQL.

Creio que se as chaves não estiverem bem distribuidas no BD não vou conseguir fazer a listagem certa.Correto?

rfsilva

Maureli:
Estou fazendo várias combinações aqui, e o erro realmente está na consulta SQL.

Creio que se as chaves não estiverem bem distribuidas no BD não vou conseguir fazer a listagem certa.Correto?

Maureli, vou chutar:

table Endereco (id, numero, rua, complemento)
table Cliente (id, nome, cpf, endereco_id (chave estrangeira para id do endereco))
table Box (id, numero, vago, cliente_id (chave estrangeira para id do cliente))

Imagino, então, nesse cenário, a seguinte consulta

select * from endereco, cliente, box where endereco.id = cliente.endereco_id and box.cliente_id = cliente.id

A where clause tem que amarrar as três tabelas, senão você fatalmente terá registros duplicados de todas as tabelas envolvidas.

Maureli

Meu banco está assim

Table Box(id_box, numero, vago);

Table Cliente(id_cliente, cpf, nome, Fk_Cliente_box(chave estrangeira para id do Box))

Table Endereco(id_endereco, rua, numero, complemento, FK_endereco_cliente(Chave estrangeira para o id do Cliente))
Maureli

Obrigado pela força rfSilva, consegui amarrar as tabelas aqui!

Grande abraço!!!

Criado 15 de fevereiro de 2011
Ultima resposta 15 de fev. de 2011
Respostas 9
Participantes 2