identidade de SQL inserção através JdbcTemplate
-
13-09-2019 - |
Pergunta
É possível obter a identidade @@ a partir da inserção SQL em uma Primavera jdbc chamada modelo? Se sim, como?
Solução
O método JDBCTemplate.update
está sobrecarregada para tirar um objeto chamado GeneratedKeyHolder que você pode usar para recuperar a chave gerada automaticamente. Por exemplo (código retirado aqui ):
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
Outras dicas
SimpleJdbcInsert.executeAndReturnKey
Que tal? Ele assume duas formas, dependendo da entrada:
(1) A entrada é um Map
public java.lang.Number executeAndReturnKey(java.util.Map<java.lang.String,?> args)
Descrição copiado a partir da interface:
SimpleJdbcInsertOperations
Executar a inserção usando os valores passados ??e devolver a chave gerada. Isto requer que o nome das colunas com auto chaves gerado foram especificados. Este método sempre retornará um
KeyHolder
mas o chamador deve verificar se ele realmente contém as chaves geradas.especificado por:
executeAndReturnKey
na interface deSimpleJdbcInsertOperations
Parâmetros:
args - Map containing column names and corresponding value
Returns:
the generated key value
(2) A entrada é um SqlParameterSource
public java.lang.Number executeAndReturnKey(
SqlParameterSource
parameterSource)
Descrição copiado a partir da interface:
SimpleJdbcInsertOperations
Executar a inserção usando os valores passados ??e devolver a chave gerada. Isto requer que o nome das colunas com auto chaves gerado foram especificados. Este método sempre retornará um
KeyHolder
mas o chamador deve verificar se ele realmente contém as chaves geradas.especificado por:
executeAndReturnKey
na interface deSimpleJdbcInsertOperations
Parâmetros:
parameterSource - SqlParameterSource containing values to use for insert
Returns:
o valor da chave gerada.
Como adicionar notas detalhadas / código de exemplo para todd.pierzina resposta ??p>
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();
Eu não sei se existe um "one-liner", mas este parece fazer o truque (para MSSQL pelo menos):
// -- call this after the insert query...
this._jdbcTemplate.queryForInt( "select @@identity" );
artigo decente aqui .