identity from sql insert via jdbctemplate

JavaSql ServerSpringJdbcJdbctemplate

Java Problem Overview


Is it possible to get the @@identity from the SQL insert on a Spring jdbc template call? If so, how?

Java Solutions


Solution 1 - Java

The JDBCTemplate.update method is overloaded to take an object called a GeneratedKeyHolder which you can use to retrieve the autogenerated key. For example (code taken from 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

Solution 2 - Java

How about SimpleJdbcInsert.executeAndReturnKey? It takes two forms, depending on the input:

(1) The input is a Map

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

> Description copied from interface: SimpleJdbcInsertOperations

> Execute the insert using the values passed in and return the generated key. This requires that the name of the columns with auto generated keys have been specified. This method will always return a KeyHolder but the caller must verify that it actually contains the generated keys.

> Specified by:

> executeAndReturnKey in interface SimpleJdbcInsertOperations

> Parameters:

> args - Map containing column names and corresponding value

> Returns:

> the generated key value

(2) The input is a SqlParameterSource

> public java.lang.Number executeAndReturnKey(SqlParameterSource parameterSource)

> Description copied from interface: SimpleJdbcInsertOperations

> Execute the insert using the values passed in and return the generated key. This requires that the name of the columns with auto generated keys have been specified. This method will always return a KeyHolder but the caller must verify that it actually contains the generated keys.

> Specified by:

> executeAndReturnKey in interface SimpleJdbcInsertOperations

> Parameters:

> parameterSource - SqlParameterSource containing values to use for insert

> Returns:

> the generated key value.

Solution 3 - Java

Adding detailed notes/sample code to todd.pierzina answer

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();

Solution 4 - Java

I don't know if there is a "one-liner" but this seems to do the trick (for MSSQL at least):

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

Decent article here.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionjavamonkey79View Question on Stackoverflow
Solution 1 - JavaJason GritmanView Answer on Stackoverflow
Solution 2 - Javatodd.pierzinaView Answer on Stackoverflow
Solution 3 - JavaSheetal Mohan SharmaView Answer on Stackoverflow
Solution 4 - Javajavamonkey79View Answer on Stackoverflow