Is it possible to get the @@identity from the SQL insert on a Spring jdbc template call? If so, how?
4 に答える
このJDBCTemplate.update
メソッドは、自動生成されたキーを取得するために使用できる GeneratedKeyHolder と呼ばれるオブジェクトを取得するためにオーバーロードされます。例(コードはhereから取得):
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
どうSimpleJdbcInsert.executeAndReturnKey
ですか?入力に応じて、次の 2 つの形式を取ります。
(1) 入力はMap
public java.lang.Number executeAndReturnKey(java.util.Map<java.lang.String,?> args)
インターフェイスからコピーされた説明:
SimpleJdbcInsertOperations
渡された値を使用して挿入を実行し、生成されたキーを返します。これには、自動生成されたキーを持つ列の名前が指定されている必要があります。このメソッドは常に を返します
KeyHolder
が、呼び出し元は生成されたキーが実際に含まれていることを確認する必要があります。指定者:
executeAndReturnKey
インターフェイスでSimpleJdbcInsertOperations
パラメーター:
args - Map containing column names and corresponding value
戻り値:
the generated key value
(2) 入力はSqlParameterSource
public java.lang.Number executeAndReturnKey(
SqlParameterSource
parameterSource)
インターフェイスからコピーされた説明:
SimpleJdbcInsertOperations
渡された値を使用して挿入を実行し、生成されたキーを返します。これには、自動生成されたキーを持つ列の名前が指定されている必要があります。このメソッドは常に を返します
KeyHolder
が、呼び出し元は生成されたキーが実際に含まれていることを確認する必要があります。指定者:
executeAndReturnKey
インターフェイスでSimpleJdbcInsertOperations
パラメーター:
parameterSource - SqlParameterSource containing values to use for insert
戻り値:
生成されたキー値。
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();
「ワンライナー」があるかどうかはわかりませんが、これでうまくいくようです(少なくともMSSQLの場合):
// -- call this after the insert query...
this._jdbcTemplate.queryForInt( "select @@identity" );
ここのまともな記事。