¿Hay alguna manera de recuperar el ID de autoincrement de una statement preparada?

¿Hay alguna manera de recuperar la clave generada automáticamente de una consulta DB al usar una consulta java con declaraciones preparadas?

Por ejemplo, sé que AutoGeneratedKeys puede funcionar de la siguiente manera.

stmt = conn.createStatement(); stmt.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS); if(returnLastInsertId) { ResultSet rs = stmt.getGeneratedKeys(); rs.next(); auto_id = rs.getInt(1); } 

Sin embargo. ¿Qué sucede si quiero hacer una inserción con una Declaración preparada?

 String sql = "INSERT INTO table (column1, column2) values(?, ?)"; stmt = conn.prepareStatement(sql); //this is an error stmt.executeUpdate(Statement.RETURN_GENERATED_KEYS); if(returnLastInsertId) { //this is an error since the above is an error ResultSet rs = stmt.getGeneratedKeys(); rs.next(); auto_id = rs.getInt(1); } 

¿Hay alguna manera de hacer esto que yo no sepa? Parece desde el javadoc que PreparedStatements no puede devolver el ID generado automáticamente.

Sí. Mira aquí . Sección 7.1.9. Cambia tu código a:

 String sql = "INSERT INTO table (column1, column2) values(?, ?)"; stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); stmt.executeUpdate(); if(returnLastInsertId) { ResultSet rs = stmt.getGeneratedKeys(); rs.next(); auto_id = rs.getInt(1); } 

Hay un par de maneras, y parece diferente, los controladores jdbc manejan las cosas un poco diferente, o no en todos los casos (algunos solo le darán claves primarias autogeneradas, no otras columnas) pero las formas básicas son

 stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 

O use este formulario:

 String autogenColumns[] = {"column1","column2"}; stmt = conn.prepareStatement(sql, autogenColumns) 

Sí, hay una manera. Acabo de encontrar este escondite en el documento de Java.

El camino es pasar el id AutoGeneratedKeys de la siguiente manera

 String sql = "INSERT INTO table (column1, column2) values(?, ?)"; stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); 

Soy uno de esos que surfearon a través de algunos hilos buscando la solución a este problema … y finalmente lo pusieron a trabajar. PARA LOS QUE UTILIZAN jdbc: oracle: thin: con ojdbc6.jar TENGA EN CUENTA: Puede usar cualquiera de los métodos: (Método 1)

 Try{ String yourSQL="insert into Table1(Id,Col2,Col3) values(SEQ.nextval,?,?)"; myPrepStatement = .prepareStatement(yourSQL, Statement.RETURN_GENERATED_KEYS); myPrepStatement.setInt(1, 123); myPrepStatement.setInt(2, 123); myPrepStatement.executeUpdate(); ResultSet rs = getGeneratedKeys; if(rs.next()) { java.sql.RowId rid=rs.getRowId(1); //what you get is only a RowId ref, try make use of it anyway U could think of System.out.println(rid); } } catch (SQLException e) { // } 

(Método 2)

 Try{ String yourSQL="insert into Table1(Id,Col2,Col3) values(SEQ.nextval,?,?)"; //IMPORTANT: here's where other threads don tell U, you need to list ALL cols //mentioned in your query in the array myPrepStatement = .prepareStatement(yourSQL, new String[]{"Id","Col2","Col3"}); myPrepStatement.setInt(1, 123); myPrepStatement.setInt(2, 123); myPrepStatement.executeUpdate(); ResultSet rs = getGeneratedKeys; if(rs.next()) { //In this exp, the autoKey val is in 1st col int id=rs.getLong(1); //now this's a real value of col Id System.out.println(id); } } catch (SQLException e) { // } 

Básicamente, intente no utilizar Method1 si solo quiere el valor de SEQ.Nextval, porque simplemente devuelve el ref de RowID que puede descifrar su cabeza encontrando la forma de usarlo, que también no se ajusta a todos los tipos de datos que intentó lanzar. a! Esto puede funcionar bien (return real val) en MySQL, DB2 pero no en Oracle.

Y apague su SQL Developer, Toad o cualquier cliente que use la misma sesión de inicio de sesión para hacer INSERT cuando esté depurando. PUEDE que no le afecte cada vez (llamada de depuración) … hasta que encuentre que sus aplicaciones se congelan sin excepción durante algún tiempo. Sí … detener sin excepción!

  Connection connection=null; int generatedkey=0; PreparedStatement pstmt=connection.prepareStatement("Your insert query"); ResultSet rs=pstmt.getGeneratedKeys(); if (rs.next()) { generatedkey=rs.getInt(1); System.out.println("Auto Generated Primary Key " + generatedkey); }