Ajuda com metodo listar

7 respostas
A

Boa tarde gente, precisava de uma ajudinha de vcs. tenho o metodo listar, eu queria listar a classe pai e tbm as classes filhas juntas. Sera que isso e possivel, seria em base desse sql. O Sql ta tudo ok, so o array que eu nao sei como fazer. Obrigado

public List Listar(){
        String sql = "SELECT cliente.*, cpfcliente, rgcliente, NULL AS cnpjcliente, NULL AS inscricaoestadualcliente FROM cliente INNER JOIN clientefisico ON cliente.codcliente = clientefisico.Cliente_codcliente UNION SELECT cliente.*, NULL AS cpfcliente, NULL AS rgcliente, cnpjcliente, inscricaoestadualcliente FROM cliente INNER JOIN clientejuridico ON cliente.codcliente = clientejuridico.Cliente_codcliente";//aqui é a query
        List<Cliente> listar = new ArrayList<Cliente>();
        List<ClienteFisico> listar = new ArrayList<ClienteFisico>();
        List<ClienteJuridico> listar = new ArrayList<ClienteJuridico>();
        try{
            PreparedStatement ps = con.prepareStatement(sql);//você prepara a query pra ser executada
           
            ResultSet rs = ps.executeQuery();//executa a query retornando os dados num resultSet
           
            while(rs.next()){//enquanto tiver registro...
                ClienteFisico fisico = new ClienteFisico();
                ClienteJuridico juridico = new ClienteJuridico();
                Cliente cliente = new Cliente();
                cliente.setCodcliente(rs.getInt(1));
                cliente.setNomecliente(rs.getString(2));
                cliente.setLogradourocliente(rs.getString(3));
                cliente.setNumerocliente(rs.getInt(4));
                cliente.setBairrocliente(rs.getString(5));
                cliente.setCidadecliente(rs.getString(6));
                cliente.setUfcliente(rs.getString(7));
                cliente.setCepcliente(rs.getString(8));
                cliente.setEmailcliente(rs.getString(9));
                cliente.setTelefonecliente(rs.getString(10));
                cliente.setComplementocliente(rs.getString(11));
                cliente.setCelularcliente(rs.getString(12));
                fisico.setCpfcliente(rs.getString(13));
                fisico.setRgcliente(rs.getString(14));
                juridico.setCnpjcliente(rs.getString(15));
                juridico.setInscricaoestadualcliente(rs.getString(16));
                listar.add(cliente);//...ele acrescenta na sua lista
                
            }                
           
            return listar;//retorna a lista
           
        }catch(Exception ex){//se der algum erro, ele manda a mensagem com o erro ocorrido
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Erro", JOptionPane.ERROR_MESSAGE);
            return null;
        }
    }

7 Respostas

nel

Oi!

Veja se eu entendi direito, você quer que um único list contenha objetos distintos, sendo eles:

  • Classe Pai
  • Classe Filho

É isso?
Só para te deixar claro, se declarar a lista sendo um objeto Pai, ela aceita que seja adicionado todos os objetos filhos, está ciente disso né? :slight_smile:

Abraços.

guilherme.dio

Estude um pouco sobre herança:

http://www.tiexpert.net/programacao/java/heranca.php

A

nel e isso mesmo que eu quero, mas estou meio cego, e a cabeca nao pensa mais em nada, como eu faco isso ?

henriqueluz

Se as classes ClienteFisico e Cliente juridico estenderem de Cliente basta você utilizar esta declaração:

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

Daí a sua lista aceitara os objetos Cliente, ClienteFisico e ClienteJuridico.

Abs,

A
Eu ja fiz assim amigao e da erro. ja fiz dessas 2 maneiras abaixo.
cliente.setComplementocliente(rs.getString(11));
                cliente.setCelularcliente(rs.getString(12));
                ((ClienteFisico) cliente).setCpfcliente(rs.getString(13));
                ((ClienteFisico) cliente).setRgcliente(rs.getString(14));
                ((ClienteJuridico) cliente).setCnpjcliente(rs.getString(15));
                ((ClienteJuridico) cliente).setInscricaoestadualcliente(rs.getString(16));
                
                listar.add(cliente);//...ele acrescenta na sua lista
E deu erro
modelo.Cliente cannot be cast to modelo.ClienteFisico

E tbm fiz dessa maneira

List<Cliente> listar = new ArrayList<Cliente>(); 
......
......
....
Cliente cliente = new Cliente();  
               cliente.setCodcliente(rs.getInt(1));  
               cliente.setNomecliente(rs.getString(2));  
               cliente.setLogradourocliente(rs.getString(3));  
               cliente.setNumerocliente(rs.getInt(4));  
               cliente.setBairrocliente(rs.getString(5));  
               cliente.setCidadecliente(rs.getString(6));  
               cliente.setUfcliente(rs.getString(7));  
               cliente.setCepcliente(rs.getString(8));  
               cliente.setEmailcliente(rs.getString(9));  
               cliente.setTelefonecliente(rs.getString(10));  
               cliente.setComplementocliente(rs.getString(11));  
               cliente.setCelularcliente(rs.getString(12));  
               fisico.setCpfcliente(rs.getString(13));  
               fisico.setRgcliente(rs.getString(14));  
               juridico.setCnpjcliente(rs.getString(15));  
               juridico.setInscricaoestadualcliente(rs.getString(16));  
               listar.add(cliente);//...ele acrescenta na sua lista

E nao consigo nada, so erro. Poxa gente por favor tem como colocar o exemplo completo pra mim. Mto obrigado pelas resposta de todos

nel

Oi!

Você não pode fazer um cast de uma classe Pai para uma classe Filho, somente o inverso.
Vou exemplificar, veja se fica mais claro:

public class Pessoa {
   private String nome;
   // getters and setters;
}

public class PessoaFisica extends Pessoa {
   private String cpf;
   // getters and setters
}

public class PessoaJuridica extends Pessoa {
   private String cnpj;
   // getters and setter
}

public List<Pessoa> getAllPeople() {
      PessoaFisica pf = new PessoaFisica();
       // é filho, portanto, tem acesso ao método
      pf.setNome(rs.getString(1);
      pf.setCpf(rs.getString(2));
     
      PessoaJuridica pj = new PessoaJuridica();
      // é filho, portanto, tem acesso ao método
      pj.setNome(rs.geString(3));
      pj.setCnpj(rs.getString(4));

      List<Pessoa> result = new ArrayList<Pessoa>();
      result.add(pf);
      result.add(pj);

      return result;
}

Se eu quiser apenas nome, sem me interessar se é PJ ou PF, basta instanciar somente a classe Pessoa.
Veja, posso instanciar as três classes, gerar objeto e adicionar todas elas na mesma lista sem nenhum problema.
Como a lista é de Pessoa e PessoaFisica e PessoaJuridica são filhas de Pessoa, não gera problema de cast ou algo do tipo.

Perceba, isto também seria válido:

Pessoa p = new PessoaFisica();

Aqui, você não tem acesso aos métodos contidos em PessoaFisica, pois a classe pessoa não possui acesso aos métodos da classe PessoaFisica, por exemplo.

Já o inverso é falso:
PessoaFisica pf = new Pessoa();

Fui claro?

Abraços.

A

Show de bola nel, obrigado ja me deu uma luz. Obrigado a todos pelas respostas, e sempre mais respostas serao bem vindas.

Criado 28 de julho de 2011
Ultima resposta 29 de jul. de 2011
Respostas 7
Participantes 4