1
resposta

tentei implementar minha logica para retorna a query do sql mas na primeira linha do try ele ja gera um erro

public Conta listarContaNumero(Integer id) throws SQLException {
    Conta conta;
    String sql = "select * from conta where numero = ?";
    PreparedStatement preparedStatement = conn.prepareStatement(sql);
    preparedStatement.setInt(1, id);
    ResultSet resultados = preparedStatement.executeQuery();
    try {
        Integer numero = resultados.getInt(1);
        BigDecimal saldo = resultados.getBigDecimal(2);
        String nome = resultados.getString(3);
  
        String cpf = resultados.getString(4);
        String email = resultados.getString(5);
        DadosCadastroCliente dadosCadastroCliente = new DadosCadastroCliente(nome, cpf, email);
        Cliente cliente = new Cliente(dadosCadastroCliente);
        conta = new Conta(numero, cliente);
        System.out.println(conta);
        resultados.close();
        conn.close();
        return conta;

    } catch (Exception e) {
        resultados.close();
        conn.close();
        throw new RuntimeException(e);
    }
}

Exception in thread "main" java.lang.RuntimeException: java.sql.SQLException: Before start of result set at br.com.alura.bytebank.domain.conta.contaDAO.listarContaNumero(contaDAO.java:89) at br.com.alura.bytebank.domain.conta.ContaService.buscarContaPorNumero(ContaService.java:79) at br.com.alura.bytebank.domain.conta.ContaService.realizarDeposito(ContaService.java:54) at br.com.alura.bytebank.BytebankApplication.realizarDeposito(BytebankApplication.java:134) at br.com.alura.bytebank.BytebankApplication.main(BytebankApplication.java:36) Caused by: java.sql.SQLException: Before start of result set at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) at com.mysql.cj.jdbc.result.ResultSetImpl.checkRowPos(ResultSetImpl.java:532) at com.mysql.cj.jdbc.result.ResultSetImpl.getObject(ResultSetImpl.java:1322) at com.mysql.cj.jdbc.result.ResultSetImpl.getInt(ResultSetImpl.java:830) at br.com.alura.bytebank.domain.conta.contaDAO.listarContaNumero(contaDAO.java:74) ... 4 more

Algum de voce consegue identificar algum erro de logica?

1 resposta

Boa tarde, João!

Quando você executa a query com preparedStatement.executeQuery(), o retorno será um conjunto de linhas da tabela que são selecionadas pela query. Com esse conjunto, você precisa indicar qual dessas linhas será acessada, isso pode ser feito com resultados.next(), que pegará a próxima linha não acessada. Após isso, é possível acessar aos dados do ResultSet.

Segue adaptação da sua implementação:

public Conta  listarContaNumero(Integer id) throws SQLException {
        Conta conta;
        String sql = "select * from conta where numero = ?";
        PreparedStatement preparedStatement = conn.prepareStatement(sql);
        preparedStatement.setInt(1, id);
        ResultSet resultados = preparedStatement.executeQuery();
        try {
            // IF adicionado para verificar se existe uma próxima linha a ser acessada
            if (resultados != null && resultados.next()) {
                Integer numero = resultados.getInt(1);
                BigDecimal saldo = resultados.getBigDecimal(2);
                String nome = resultados.getString(3);

                String cpf = resultados.getString(4);
                String email = resultados.getString(5);
                DadosCadastroCliente dadosCadastroCliente = new DadosCadastroCliente(nome, cpf, email);
                Cliente cliente = new Cliente(dadosCadastroCliente);
                conta = new Conta(numero, cliente);
                System.out.println(conta);
            }
            resultados.close();
            conn.close();
            return conta;

        } catch (Exception e) {
            resultados.close();
            conn.close();
            throw new RuntimeException(e);
        }
    }

O código que você mandou estava tentando acessar dados de uma linha antes de definir de qual linha seria. Essa nova implementação define a primeira linha como a linha a ser acessada.