ResultSet retorna somente um valor

12 respostas
scheleder

Tenho um ResultSet que busca nomes de usuarios (57 nomes diferentes) no banco de dados, porém ele retorna 57 valores iguais.
O que há de errado?
Código:

public List<Usuario> findAll() {
        String SQL = "SELECT nome FROM usuario";
        PreparedStatement stmt = null;
        ResultSet rs = null;

        List<Usuario> usuarios = new ArrayList<>();

        try {
            stmt = con.prepareStatement(SQL);
            rs = stmt.executeQuery();

            while (rs.next()) {
                Usuario usuario = new Usuario();
                usuario.setNome(rs.getString("nome"));

                //FALTA ALGO
                usuarios.add(usuario);
                
            }

        } catch (SQLException ex) {
            System.err.println("Erro: " + ex);
        } finally {
            ConnectionFactory.closeConnection(con, stmt, rs);
        }
        //System.out.println(usuarios);
        return usuarios;
    }

12 Respostas

fventurajr

Esta classe Usuario só tem nome como atributo? Você poderia tentar
apenas por experiência usar um construtor informando o nome assim:

usuarios.add(new Usuario(rs.getString("nome"));

scheleder

Não.
Os atributos são nome, matricula, senha e tipo.
Já tentei com os outros atributos e nada.
tem algo errado no ResultSet, mas não achei.

PedreiroDeSoftware

Qual o método que imprime os usuários?
Use o debug, marque a linha que adiciona na lista.
Navegue nos índices e verifique os nomes.

scheleder

O objetivo e ler o nome dos usuarios e popular uma jcombobox.
Nem acredito que to me batendo com isso.

scheleder

Esta é a parte que popula o jcombobox:

private void buscaUsers() {
        UsuarioDAO dao = new UsuarioDAO();
        List<Usuario> users = dao.findAll();
       
       
        DefaultComboBoxModel cbmodel = new DefaultComboBoxModel(users.toArray());
        cbUsers.setModel(cbmodel);
    }
PedreiroDeSoftware

Você conferiu se há 57 registros diferentes no banco de dados???

while (rs.next()) { 
    Usuario usuario = new Usuario(); 
    usuario.setNome(rs.getString("nome")); 
    System.out.println(rs.getString("nome"));//olhar o que está sendo impresso
    //FALTA ALGO usuarios.add(usuario);
 }
scheleder

Opa!

Agora deu uma luz.

Está imprimindo os nomes corretamente, mas na lista todos os nomes são iguais ao último.

scheleder

Resolvido.
Mudei o tipo da lista pra String.

public List findAll() {

String SQL = SELECT nome FROM usuario;

PreparedStatement stmt = null;

ResultSet rs = null;
List<String> usuarios = new ArrayList<>();

    try {
        stmt = con.prepareStatement(SQL);
        rs = stmt.executeQuery();

        while (rs.next()) {
            Usuario usuario = new Usuario();
            usuario.setNome(rs.getString("nome"));
            //System.out.println(rs.getString("nome"));
            usuarios.add(rs.getString("nome"));
            // usuarios.add(usuario);
        }

    } catch (SQLException ex) {
        System.err.println("Erro: " + ex);
    } finally {
        ConnectionFactory.closeConnection(con, stmt, rs);
    }
    System.out.println(usuarios);
    return usuarios;
}
private void buscaUsers() {

UsuarioDAO dao = new UsuarioDAO();

List users = dao.findAll();
DefaultComboBoxModel cbmodel = new DefaultComboBoxModel(users.toArray());
    cbUsers.setModel(cbmodel);
}
FacaNaCaveira

Falai @scheleder Bom dia
Ja sei que seu problema ja esta resolvido mas teria como postar o codigo da sua classe Usuario?

Abraços
Max

scheleder

public class Usuario {
//

public static String matricula;
public static String nome;
public static String tipo;
public static String senha;
static String senhaDigitada;
static String matriculaDigitada;
static String dado;
static String campo;

//

public Usuario() {
}

public Usuario(String matricula, String nome, String tipo, String senha) {
    Usuario.matricula = matricula;
    Usuario.nome = nome;
    Usuario.tipo = tipo;
    Usuario.senha = senha;
}
// 

public String getSenhaDigitada() {

return senhaDigitada;

}
public void setSenhaDigitada(String senhaDigitada) {
    Usuario.senhaDigitada = senhaDigitada;
}

public String getMatriculaDigitada() {
    return matriculaDigitada;
}

public void setMatriculaDigitada(String matriculaDigitada) {
    Usuario.matriculaDigitada = matriculaDigitada;
}

public String getDado() {
    return dado;
}

public void setDado(String dado) {
    Usuario.dado = dado;
}

public String getCampo() {
    return campo;
}

public void setCampo(String campo) {
    Usuario.campo = campo;
}

public String getMatricula() {
    return matricula;
}

public void setMatricula(String matricula) {
    Usuario.matricula = matricula;
}

public String getNome() {
    return nome;
}

public void setNome(String nome) {
    Usuario.nome = nome;
}

public String getTipo() {
    return tipo;
}

public void setTipo(String tipo) {
    Usuario.tipo = tipo;
}

public String getSenha() {
    return senha;
}

public void setSenha(String senha) {
    Usuario.senha = senha;
}

@Override
public String toString() {
    return this.nome;
}

//
}

PedreiroDeSoftware

Remova o static pois ele é para atributos pertencentes à classe, assim os atributos serão do objeto.

Por isso imprimia sempre o último nome encontrado na busca.

FacaNaCaveira

Sabia que tinha algo de muito estranho nessa classe Usuario

Criado 19 de dezembro de 2019
Ultima resposta 23 de dez. de 2019
Respostas 12
Participantes 4