ResultSet retorna somente um valor

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;
    }

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"));

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.

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.

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

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);
    }

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);
 }
1 curtida

Opa!

Agora deu uma luz.

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

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);
}

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

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;
}

//
}

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.

1 curtida

Sabia que tinha algo de muito estranho nessa classe Usuario

1 curtida