Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Exception ao tentar buscar o id criado no insert

Confesso que modifiquei um pouco o código ensinado, mas não vejo onde isso pode estar causando o problema (mas talvez esteja hehehe vamos ver)

Segue abaixo o meu método adicionar, o script de CREATE e a exception que está ocorrendo. Decidi passar a conexão por parâmetro ao invés de passar o statement, pois achei que o método adicionar é que deveria cuidar disso.

Outra alteração é que estou utilizando banco de dados MySQL e não repara a terminologia em Inglês... Longa história.

O erro ocorre quando tento utilizar o resultSet.getString("id") para buscar o id gerado pelo insert. Realizei um teste sem este print, e a inserção está ocorrendo corretamente. Aparentemente ele apenas não está reconhecendo o campo "id" no recordset que vem de statement.getGeneratedKeys(). Será que o MySQL retorna um nome diferente de coluna do que o HSQL?

Método Adicionar:

    private static void insertProduct(String name, String description, Connection connection) throws SQLException{
        String sql = "insert into product (name,description) values (?, ?)";
        try (PreparedStatement statement = connection.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS)) {
            statement.setString(1, name);
            statement.setString(2, description);
            boolean result = statement.execute();
            System.out.println(result);
            try (ResultSet resultSet = statement.getGeneratedKeys()) {
                resultSet.first();
                System.out.println("Product with id '" + resultSet.getString("id") + "' was created");
            }
        }
    }

Script CREATE:

CREATE TABLE Product (id          INTEGER AUTO_INCREMENT PRIMARY KEY
                     ,name        VARCHAR(255)
                     ,description VARCHAR(255)
                     );

Saída do sistema no momento em que o erro ocorre:

false
java.sql.SQLException: Column 'id' not found.
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
    at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1077)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5190)
    at ConnectionTest.insertProduct(ConnectionTest.java:44)
    at ConnectionTest.main(ConnectionTest.java:24)
2 respostas

Opa, confesso que não conhecia esse método, bem legal.. mas de todo jeito a exception está clara, ele não está retornando a coluna id. De acordo com a documentação(https://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html#getGeneratedKeys()), se ele não conseguir resolver o nome da coluna, vai gerado um nome para vc consultar... tenta descobrir quais colunas estão voltando.

Tem um método que chama getMetaData que te retorna um objeto com informações sobre o retorno da query.. da pra vc descobrir os nomes das colunas que estão voltando.

solução!

Alberto, descobri!

Não sei se isso é o MySQL que me retorna com este nome, mas aqui o nome da coluna gerada é "GENERATED_KEY".

Taí mais uma coisa que poderia ser pesquisada pra deixar pelo menos na parte escrita do curso. Quais as mudanças que devem ser realizadas no código quando se muda o tipo de banco de dados. Fica como sugestão.

Obrigado!