Dados duplicados após o select[Resolvido]

5 respostas
Dani_Gomes

Estou dando um select dentro da minha DAO e adicionando para dentro de uma list, mas na hora de imprimir a list aparece os dados do último cadastro repetidamente, no mesmo número de linhas que deveria aparecer os outros cadastros.
Segue abaixo o código da DAO:

public List<portariaBean> consultaGeral(portariaBean bean)throws Exception,SQLException {
        List<portariaBean> lista  = new ArrayList<portariaBean>();
        String sql = "SELECT * FROM "+bean.getTabela()+" WHERE "+bean.getColunaTabela()+" LIKE '%"+bean.getBusca()+"%'";
        PreparedStatement stmt= (PreparedStatement)connDB.connect(bean).prepareStatement(sql);
        rs=stmt.executeQuery();
        while(rs.next()){
            bean.setCodigo(rs.getString("id"));
            bean.setNome(rs.getString("nome"));
            lista.add(bean);
        }
        rs.close();
        stmt.close();
        return lista;
    }

5 Respostas

fernandopaiva

Dani, naum concatene Strings no SQL…e leia a apostila FJ21 da Caelum na parte de DAO…

veja o exemplo

public class ClientesDAO{
    private Connection con;
    public ClientesDAO(){
          this.con = Conexao.getConnection();
    }

public List<Clientes> getClientes(String nomCli, String sobNomCli){
     List<Clientes> lista = new ArrayList();
     PreparedStatement stm = this.con.prepareStatement("SELECT * FROM Clientes WHERE CliNom = ? AND CliSobNome = ? ORDER BY CliNom");
     stm.setString(1, nomCli);
     stm.setString(2, sobNomCli);
     ResultSet rs = stm.executeQuery();
     while(rs.next()){
           Clientes cli = new Clientes(); //aqui eu pego e populo o bean de clientes
           cli.setCliNom(rs.getString("CliNom"); 
           cli.setCliSobNom(rs.getString("CliSobNom"));
           lista.add(cli);
     }
     stm.close();
     rs.close();
     return lista;
}

//pegando os valores e exibindo.
public static void main(String[] args){
    ClientesDAO cliDAO = new ClientesDAO();
    List<Clientes> lista = cliDAO.getClientes("Fernando","Paiva");
    for(Clientes c : lista){
         System.out.println(c.getCliNom());
         System.out.println(c.getCliSobNom());
    }

}

Basicamente eh isso, leia a apostila FJ21 da Caelum q tem muita coisa sobre DAO. E pare de concatenar String nos seus SQL.

t+ e boa sorte.

Dani_Gomes

fernandopaiva.
Onde encontro esta apostila?
O meu problema não é na concatenação e sim na lista, que não está passando os dados corretamente.

fernandopaiva

sim sim, realmente esta na lista mas isso se deve a forma como implementou seu DAO, veja o exemplo q fiz q vc consegue acertar.

para baixar a apostila FJ11 e FJ21, digite no google …Apostilas Caelum FJ21 e FJ11, vc vai encontra-las facilmente…a FJ21 na parte de DAO vai clarear sua mente.

t+ e boa sorte

Diguinho.Max

vc pode usar uma StringBuilder para isto.

Dani_Gomes

Consegui resolver.
Agradeço a ajuda de vc’s, fernandopaiva e diguinho.max.
Só para constar, mas achei a resposta em:
http://www.guj.com.br/java/219175-resolvido-jtable–consulta-no-banco-de-dados-retornando-mesmo-registro
Porém o fato é que eu não estava instanciando meu bean dentro do while.
Esta linha que faltou:

Onde o fernandopaiva diz que pega e popula o bean, na verdade ele faz uma nova(new) instancia do bean, que é onde o novo cadastro do select será armazenado para dentro da list.
Abraços.

Criado 13 de outubro de 2011
Ultima resposta 14 de out. de 2011
Respostas 5
Participantes 3