Spring jdbcテンプレート呼び出しのSQL挿入から@@ identityを取得することは可能ですか?もしそうなら、どのように?
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つの形式を取ります。
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
_
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" );
まともな記事 こちら 。