[RESOLVIDO]Problemas com list com relacao

18 respostas
J

Bom noite galera.

Estou com duvida em como fazer um list de relação.

Segue abaixo um pequeno código com tabelas não relacional, como eu faria com tabelas relacionais?

Tenho 2 classes para relação a Cliente e Endereço

Estou tentando listar na minha (tabela consulta) o endereço também mas só que dar erro , quando eu pego o valor do endereço pq eu não listei a class Endereço .
Como eu faria para fazer essa relação.

public List getLista (String nome)

String sql = “select * from cliente where nome like ?”; /sei que aqui deveria estar chamando com tabela relacional/ se souberem tmb.

List<Cliente> minhaLista;
       try (PreparedStatement stmt = this.conexao.prepareStatement(sql)) {
           stmt.setString(1, nome);
        try (ResultSet rs = stmt.executeQuery()) {
            minhaLista = new ArrayList<Cliente>();
            while (rs.next()) {
                Cliente c1 = new Cliente();
                c1.setCodcliente(Integer.valueOf(rs.getString("codcliente")));
                c1.setNome(rs.getString("nome"));
                c1.setTelefone(rs.getString("telefone"));
                c1.setCpf(rs.getString("cpf"));
                c1.setEmail(rs.getString("email"));
                c1.setDatanascimento(rs.getString("datanascimento"));
                c1.setObservacao(rs.getString("observacao"));
 (              c1.setEndereco(rs.getString("endereco"));  Errooo!!
                c1.setObservacao(rs.getString("observacao"));                
                c1.setObservacao(rs.getString("observacao"));      
                minhaLista.add(c1);

18 Respostas

Ev3rton

Olá,

Vamos supor que você tenha as tabelas:

CLIENTE:

codigo;

nome;
ENDERECO:

codigo_cliente;

rua;

Então no seu select você juntaria essas tabelas com um join (poderia adicionar o filtro where também):
SELECT c.codigo, c.nome, e.rua FROM cliente c inner join endereco e on(e.codigo_cliente = c.codigo)

Com isso você implementaria seu código JDBC em que:
1- Primeiro você cria um objeto Cliente
2- Configura os valores das propriedades desse cliente
3- Cria um objeto Endereco
4- Configura os valores das propriedades desse endereço
5- Associa o endereço ao cliente (cliente.setEndereco(endereco))
6- Adiciona seu objeto Cliente em um List
7- Retorna o seu List

Não entendi muito bem sua dúvida, era isso mesmo?

[ ]'s

fabiocortolan

Uma dica, sempre poste seu código entre as tags “" e "” (sem aspas), facilita a visualização.
Outra coisa, no select q o Ev3rton passou d exemplo, se o endereço não for obrigatório, use LEFT OUTER JOIN no lugar de INNER JOIN, dessa forma o retorno do select será para todos os clientes que possuem ou não endereço.

J

Sim a metade foi.
Agora como faço para colocar numa lista uma relação List. sei que não e assim . mas seria tipo isso a relação que eu queria para min pegar
os dados do endereço tmb.para min mostrar na lista de consulta de uma tabela, pq so mostra os dados do cliente nao mostra do endereço.

( c1.setEndereco(rs.getString(“endereco”)); Errooo!!
c1.setEndereco.Cidade()(rs.getString(“cidade”)); = não funciona essa parte pq não chamo a classe Endereço , que conte os sets e gets,pq não sei chamar no list a relação.
c1.setEndereco.Uf(rs.getString(“uf”));

fabiocortolan

Vc tem um objeto Endereco dentro de Cliente certo?
Crie uma instância de endereço, preencha com os dados do banco e sete a instância no objeto cliente, ex:

// Depois q já pegou os dados do endereço no banco
Endereco e = new Endereco()
e.setLogradouro(rs.getString('logradouro');
e.setNumero(rs.getString('numero');
// ... restante dos campos

// Insira o objeto Endereco no objeto Cliente
c.setEndereco(e);

// Para recuperar os dados do endereço é só fazer
c.getEndereco.getLogradouro();
c.getEndereco.getNumero();
J

Muito obrigado por estar tentando me ajuda.

ate ai tudo bem.

Mas quando chega na minha lista da erro.

public List getLista (String nome) throws SQLException {

String sql = "select * from cliente where nome like ?";
    
       List<Cliente> minhaLista;
       try (PreparedStatement stmt = this.conexao.prepareStatement(sql)) {
           stmt.setString(1, nome);
        try (ResultSet rs = stmt.executeQuery()) {
            minhaLista = new ArrayList<Cliente>();
            while (rs.next()) {
                Cliente c1 = new Cliente();
                c1.setCodcliente(Integer.valueOf(rs.getString("codcliente")));
                c1.setNome(rs.getString("nome"));
                c1.setTelefone(rs.getString("telefone"));
                c1.setCpf(rs.getString("cpf"));
                c1.setEmail(rs.getString("email"));
                c1.setDatanascimento(rs.getString("datanascimento"));
                 minhaLista.add(c1);
                 
            Endereco c2 = new Endereco() ;    
                 
                c2.setEndereco(rs.getString("endereco"));
                c2.setCidade(rs.getString("cidade"));             
                c2.setUf(rs.getString("uf"));    
                minhaLista.add(c2); (AQui)) O que eu faço para a meu método minha lista ler o c1 e c2
Ev3rton

Olá,

A variável minhaLista é do tipo List, então você só pode adicionar objetos do tipo Cliente nela.

Para você associar o endereço ao cliente, sugiro que crie um atributo do tipo Endereco na sua classe Cliente, então você teria algo assim:

List<Cliente> minhaListaDeClientes = new ArrayList<Cliente>();

Cliente meuCliente = new Cliente();
//seta os atributos do cliente
Endereco meuEndereco = new Endereco();
//seta os atributos do endereco

//Associa o endereço ao cliente
meuCliente.setEndereco(meuEndereco);

//Adiciona o cliente na lista
minhaListaDeClientes.add(meuCliente);

Depois para obter o endereço, você usaria algo como:

minhaListaDeClientes.get(0).getEndereco();

[ ]'s

J

Eu tentei desse seu jeito mas não da certo de jeito nenhum.

pq tinha que vim com (conexao) do banco.
tinha que ter um while para para esta retornando toda hora no banco.

Minha classe Cliente tem sim Atributo Endereço . para estar puxando de outra tabela.

um problema tmb que deu , não estava setando os valores de cliente com (meuCliente).

Muito obrigado por estar me ajudando.

Se alguém também ter mas exemplos por favor post.

fabiocortolan

Não consigo entender onde está sua dificuldade, vamos tentar esclarecer mais alguns detalhes p/ ver se entendo melhor, seu cliente pode ter mais de um endereço? Você vai trazer os dados do endereço na mesma consulta SQL do cliente? Você já conseguiu pegar os dados do cliente e do endereço do banco?

J

A minha dificuldade e que não estou conseguindo puxar os valores da tabela endereço relacional para mostrar na minha consulta,e meu cliente só pode ter 1 endereço.a relação e 1 endereço para muitos clientes.

Você vai trazer os dados do endereço na mesma consulta SQL do cliente?sim,pq no cliente já tem o atributo endereço para já fazer isso.

Você já conseguiu pegar os dados do cliente e do endereço do banco? os dados da tabela cliente esta tudo perfeito com cliente consigo pegar e mostrar na consulta.
não estou conseguindo fazer o mesmo com endereço.

Esta faltando esta parte para min finalizar.

Muito obrigado por esta me ajudando.

fabiocortolan

Se estou entendendo direito seu problema está sendo na instrução de select no banco de dados, o Ev3rton já postou um exemplo de SELECT q pode resolver esse seu problema. Se não conseguiu implementar o exemplo dele, passa a estrutura da tabela Cliente e da tabela Endereço (se possível só chave primária e estrangeira) e o comando select q vc está utilizando.

J

Fabio eu voltei ao seu exemplo e deu certo aqui , esta sem nenhum erro mas quando eu vou mostrar o select esta dando problema.

public List getLista (String nome) throws SQLException {

String sql = "select * from cliente INNER JOIN Endereco ON cliente.idEndereco = Endereco.idEndereco WHERE Endereco.idendereço like ? "; tentei ja assim = problema =Unknown column ‘Endereco.idendereço’ in ‘where clause’.

String sql = "select * from cliente,Endereco INNER JOIN Endereco ON cliente.idEndereco = Endereco.idEndereco WHERE Endereco.idendereço like ? "; tentei assim = problema =
Not unique table/alias: ‘Endereco’

cliente = (PK)codcliente ,( fk) idEndereco;

Endereco =(PK) idendereco ;

List<Cliente> minhaLista;
       try (PreparedStatement stmt = this.conexao.prepareStatement(sql)) {
           stmt.setString(1, nome);
        try (ResultSet rs = stmt.executeQuery()) {
            minhaLista = new ArrayList<Cliente>();
            while (rs.next()) {
                Cliente c1 = new Cliente();
                c1.setCodcliente(Integer.valueOf(rs.getString("codcliente")));
                c1.setNome(rs.getString("nome"));
                c1.setTelefone(rs.getString("telefone"));
                c1.setCpf(rs.getString("cpf"));
                c1.setEmail(rs.getString("email"));  
    
            Endereco e = new Endereco();    
            
                e.setEndereco(rs.getString("endereco"));   
             e.setCidade(rs.getString("endereco"));   
             e.setUf(rs.getString("endereco"));   
             c1.setEndereco(e);
              minhaLista.add(c1);
              
           }
    rs.close();
    stmt.close();
    return minhaLista;
 
 }

}
}

Muito obrigado.

fabiocortolan

Fique atento aos erros q o sistema mostra, veja:

String sql = "select * from cliente INNER JOIN Endereco ON cliente.idEndereco = Endereco.idEndereco WHERE Endereco.idendereço like ? "; tentei ja assim = problema =Unknown column 'Endereco.idendereço' in 'where clause'.

Você colocou idendereço na cláusula WHERE, o “ç” está errado, o correto é idendereco.
Outra coisa, poste os códigos entre as tags “ e ” para facilitar a visualização.

J

Agora sim fiz tudo certo.

Mas na hora de listar o endereço ,cidade e uf não mostra na Jtable.

public  List<Cliente> getLista (String nome) throws SQLException {
       
  String sql ="select * from cliente INNER JOIN Endereco ON cliente.idEndereco = Endereco.idEndereco WHERE Endereco.idendereco like ? ";
        
           List<Cliente> minhaLista;
           try (PreparedStatement stmt = this.conexao.prepareStatement(sql)) {
               stmt.setString(1, nome);
            try (ResultSet rs = stmt.executeQuery()) {
                minhaLista = new ArrayList<Cliente>();
                while (rs.next()) {
                    Cliente c1 = new Cliente();
                    Endereco e = new Endereco();  
                    c1.setCodcliente(Integer.valueOf(rs.getString("codcliente")));
                    c1.setNome(rs.getString("nome"));
                    c1.setTelefone(rs.getString("telefone"));
                    c1.setCpf(rs.getString("cpf"));
                    c1.setEmail(rs.getString("email"));  
                    c1.setDatanascimento(rs.getString("datanascimento"));  
                    c1.setObservacao(rs.getString("observacao"));  
                    e.setEndereco(rs.getString("endereco"));   
                    e.setCidade(rs.getString("cidade"));   
                    e.setUf(rs.getString("uf"));   
                    c1.setEndereco(e);
                    minhaLista.add(c1);
               

               }
        rs.close();
        stmt.close();
        return minhaLista;
     
     }
   }
 }

Aqui seria meu método para mostrar a pesquisa.

private void mostraPesquisa(){
      while(tmCliente.getRowCount()>0){
         tmCliente.removeRow(0);
      }
      if(contatos.size() == 0){
          JOptionPane.showMessageDialog(null, "Nenhum contato cadastrado");
      }else{
          String[] linha = new String[]{null,null};
                for (int i = 0; i <contatos.size(); i++) {
         tmCliente.addRow(linha);
         tmCliente.setValueAt(contatos.get(i).getCodcliente(), i, 0);
         tmCliente.setValueAt(contatos.get(i).getNome(), i, 1);
         tmCliente.setValueAt(contatos.get(i).getTelefone(), i, 2);
         tmCliente.setValueAt(contatos.get(i).getCpf(), i, 3);
         tmCliente.setValueAt(contatos.get(i).getEmail(), i, 4);
         tmCliente.setValueAt(contatos.get(i).getDatanascimento(), i, 5);
         tmCliente.setValueAt(contatos.get(i).getObservacao(), i, 6);
         tmCliente.setValueAt(contatos.get(i).getEndereco().getEndereco(), i, 1);
         tmCliente.setValueAt(contatos.get(i).getEndereco().getUf(), i, 2);
         tmCliente.setValueAt(contatos.get(i).getEndereco().getCidade(), i, 3);
                }   
            }
        }   
   }

Se puderem me ajudar.

Muito obrigado

fabiocortolan

Como vc está pegando o endereço p/ preencher na tabela? Tem q pegar a referência do cliente ex:

// Cliente       .Endereço     .Nome da Cidade
minhaLista.get(i).getEndereco().getCidade();
J

Tentei colocar a referencia de todo jeito no meu método mostrar lista mas não consegui.
Como faço para referenciar aqui no meu método?primeira vez que tento fazer isso.

fabiocortolan

Posta o código onde vc tenta inserir os dados do endereço na tabela.

J

Seria aqui .

tmCliente.setValueAt(contatos.get(i).getEndereco().getEndereco(), i, 1);
tmCliente.setValueAt(contatos.get(i).getEndereco().getCidade(), i, 2);
tmCliente.setValueAt(contatos.get(i).getEndereco().getUf(), i, 3);

Obrigado por estar me ajudando Fabio.

J

Consegui!!!.

Era só trocar os números das posições

tmCliente.addRow(linha);

         tmCliente.setValueAt(contatos.get(i).getCodcliente(), i, 0);
         tmCliente.setValueAt(contatos.get(i).getNome(), i, 1);
         tmCliente.setValueAt(contatos.get(i).getTelefone(), i, 2);
         tmCliente.setValueAt(contatos.get(i).getCpf(), i, 3);
         tmCliente.setValueAt(contatos.get(i).getEmail(), i, 4);
         tmCliente.setValueAt(contatos.get(i).getDatanascimento(), i, 5);
         tmCliente.setValueAt(contatos.get(i).getObservacao(), i, 6);
         tmCliente.setValueAt(contatos.get(i).getEndereco().getEndereco(), i, 7);  Antes : 1
         tmCliente.setValueAt(contatos.get(i).getEndereco().getCidade(), i, 8);   Antes : 2      por isso não estava listando.
         tmCliente.setValueAt(contatos.get(i).getEndereco().getUf(), i, 9);    Antes : 3

Queria agradecer a todos que me ajudaram. principalmente o fabiocortolan.

Criado 27 de junho de 2013
Ultima resposta 1 de jul. de 2013
Respostas 18
Participantes 3