Domanda

E 'possibile ottenere il @@ identità dal inserto SQL su un modello di chiamata Spring JDBC? Se sì, come?

È stato utile?

Soluzione

Il metodo JDBCTemplate.update è sovraccarico di prendere un oggetto chiamato un GeneratedKeyHolder che è possibile utilizzare per recuperare la chiave generata automaticamente. Per esempio (codice preso da qui ):

final String INSERT_SQL = "insert into my_test (name) values(?)";
final String name = "Rob";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(
    new PreparedStatementCreator() {
        public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
            PreparedStatement ps =
                connection.prepareStatement(INSERT_SQL, new String[] {"id"});
            ps.setString(1, name);
            return ps;
        }
    },
    keyHolder);
// keyHolder.getKey() now contains the generated key

Altri suggerimenti

Come su SimpleJdbcInsert.executeAndReturnKey? Ci vogliono due forme, a seconda dell'ingresso:

(1) L'ingresso è un Map

  

public java.lang.Number executeAndReturnKey(java.util.Map<java.lang.String,?> args)

     

Descrizione copiato da interfaccia: SimpleJdbcInsertOperations

     

Esegui l'inserto utilizzando i valori passati e restituire la chiave generata.   Ciò richiede che il nome delle colonne con le chiavi di auto generato è stato specificato. Questo metodo restituirà sempre un KeyHolder ma il chiamante deve verificare che in realtà contiene le chiavi generate.

     

Specified by:

     

executeAndReturnKey interfaccia SimpleJdbcInsertOperations

     

Parametri:

     

args - Map containing column names and corresponding value

     

Returns:

     

the generated key value

(2) L'ingresso è un SqlParameterSource

  

public java.lang.Number executeAndReturnKey( SqlParameterSource parameterSource)

     

Descrizione copiato da interfaccia: SimpleJdbcInsertOperations

     

Esegui l'inserto utilizzando i valori passati e restituire la chiave generata.   Ciò richiede che il nome delle colonne con le chiavi di auto generato è stato specificato. Questo metodo restituirà sempre un KeyHolder ma il chiamante deve verificare che in realtà contiene le chiavi generate.

     

Specified by:

     

executeAndReturnKey interfaccia SimpleJdbcInsertOperations

     

Parametri:

     

parameterSource - SqlParameterSource containing values to use for insert

     

Returns:

     

il valore della chiave generata.

L'aggiunta di note dettagliate / codice di esempio per rispondere todd.pierzina

jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
        jdbcInsert.withTableName("TABLE_NAME").usingGeneratedKeyColumns(
                "Primary_key");
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("Column_NAME1", bean.getval1());
        parameters.put("Column_NAME2", bean.getval2());
        // execute insert
        Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(
                parameters));
           // convert Number to Int using ((Number) key).intValue()
            return ((Number) key).intValue();

Non so se v'è un "one-liner", ma questo sembra fare il trucco (per MSSQL almeno):

// -- call this after the insert query...
this._jdbcTemplate.queryForInt( "select @@identity" );

qui .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top