[RESOLVIDO] Busca em banco de dados Postgres

Olá a todos

Sou novo na programação em Java, e estou tentando fazer um cadastro de achados e perdidos, que deve buscar em um banco de dados coincidências em nome da pessoa ou item perdido. O programa salva no banco sem problemas, mas ao fazer a busca, recebo um erro de posicionamento, solicitando um método next(). Tentei usar um while para fazer isso, mas recebo erros de NullPointerException.

Gostaria de saber onde está o erro no código. Segue o trecho:

public ResultSet localizarItem(String encontrar) {
    String sql = "SELECT * FROM perdido WHERE nome = '" + encontrar + "' OR item_perdido = '" + encontrar + "'";

    Statement stmta;
    PreparedStatement stmt;
    ResultSet respostaBanco = null;
    
    try {
        
        stmt = ConexaoComBanco.getConexao().prepareStatement(sql);
        respostaBanco = stmt.executeQuery();
        
        while (respostaBanco.next()) {
            stmt = ConexaoComBanco.getConexao().prepareStatement(sql);
            
            respostaBanco = stmt.executeQuery(sql);
            
        }
        return respostaBanco;
    } catch (Exception ex) {
        Logger.getLogger(DAO_Item.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    }
}

Agradeço qualquer ajuda.

Amigo, acho que isso é meio obvio mas porque você não usa alguma API que facilita sua vida com o banco de dados tipo hibernate ou eclipselink?

Eu sou meio noob no assunto, mas ao executar esse código você cria uma redundancia… Você atribui sempre novos valores ao objeto de leitura do while não deixando que leia o próximo valor.

Acredito que seu código deveria ser assim:

public ResultSet localizarItem(String encontrar) {
    
String sql = "SELECT * FROM perdido WHERE nome = '" + encontrar + "' OR item_perdido = '" + encontrar + "'";

    try {        
        PreparedStatement stmt = ConexaoComBanco.getConexao().prepareStatement(sql);
        return stmt.executeQuery();
    } catch (Exception ex) {
        Logger.getLogger(DAO_Item.class.getName()).log(Level.SEVERE, null, ex);
        return null;
    }
}

Amiguinho você fez uma bagunça aí. Para pegar ler os dados do banco ou melhor extraí-los do ResultSet seria mais ou menos assim.

Connection c = ConexaoComBanco.getConexao();
     stmt = c.prepareStatement(sql);
            respostaBanco = stmt.executeQuery();
            
            while (respostaBanco.next()) {
                respostaBanco.getString("coluna 1"); Onde coluna 1 é o nome da sua coluna.
                respostaBanco.getDouble("coluna 2");Onde coluna 2 é o nome da sua coluna.
                
            }
c.close();

Atente-se que extrai o valor mas não o adicionei em lugar algum.

O ideal seria você criar uma classe que representa-se sua tabela do banco, e neste momento você instanciaria um objeto e setasse os valores provindos do banco neste objeto.

E não retorno um ResultSet no método e sim uma lista de objetos da classe que você criou.
Pois você deverá fechar a conexão com o banco após sua consulta(algo que não vi no seu código), e neste momento seu ResultSet também estará “fechado”.

Obrigado pela dica Matheusrfjava. Fiz algo nesse sentido e resolveu o meu problema.

Segue o trecho:

public ArrayList<Item> encontrarItem(String encontrar) throws SQLException {
    Statement stmt = ConexaoComBanco.getConexao().createStatement();
    ArrayList<Item> itensEncontrados = new ArrayList<>();

    String sql = "SELECT * FROM achados_perdidos WHERE nome = '" + encontrar + "' OR item_perdido = '" + encontrar + "'";

    ResultSet respostaBanco = stmt.executeQuery(sql);

    while (respostaBanco.next()) {
        Item item = new Item();
        item.setCodigo(respostaBanco.getInt("codigo"));
        item.setNome(respostaBanco.getString("nome"));
        item.setTelefone(respostaBanco.getString("telefone"));
        item.setItemPerdido(respostaBanco.getString("item_perdido"));
        item.setInformacoes(respostaBanco.getString("informacoes"));
        item.setTipoDocumento(respostaBanco.getString("tipo_documento"));
        item.setNumDocumento(respostaBanco.getString("num_documento"));
        item.setCidade(respostaBanco.getString("cidade"));
        item.setEncontrado(respostaBanco.getString("encontrado"));
        item.setDevolvido(respostaBanco.getString("devolvido"));
        item.setDataDevolucao(respostaBanco.getString("data_devolucao"));
        System.out.println(item.getCodigo() + item.getNome());
        itensEncontrados.add(item);
    }
    return itensEncontrados;
}

Talvez não seja o mais adequado, com o tempo vou aprimorando a aplicação. Por enquanto, vai me servir bem.

Obrigado pela ajuda.