Getting auto-generated key from row insertion in spring 3 / PostgreSQL 8.4.9 Getting auto-generated key from row insertion in spring 3 / PostgreSQL 8.4.9 java java

Getting auto-generated key from row insertion in spring 3 / PostgreSQL 8.4.9


KeyHolder holder = new GeneratedKeyHolder();getJdbcTemplate().update(new PreparedStatementCreator() {                           @Override                public PreparedStatement createPreparedStatement(Connection connection)                        throws SQLException {                    PreparedStatement ps = connection.prepareStatement(sql.toString(),                        Statement.RETURN_GENERATED_KEYS);                     ps.setString(1, person.getUsername());                    ps.setString(2, person.getPassword());                    ps.setString(3, person.getEmail());                    ps.setLong(4, person.getRole().getId());                    return ps;                }            }, holder);Long newPersonId = holder.getKey().longValue();

Note that in newer versions of Postgres you need to use

connection.prepareStatement(sql.toString(),     new String[] { "idcompte" /* name of your id column */ })

instead of

connection.prepareStatement(sql.toString(),     Statement.RETURN_GENERATED_KEYS);


The easiest way to get a key back from an INSERT with Spring JDBC is to use the SimpleJdbcInsert class. You can see an example in the Spring Reference Guide, in the section titled Retrieving auto-generated keys using SimpleJdbcInsert.


I'm using Spring3.1 + PostgreSQL9.1, and when I use this

    KeyHolder keyHolder = new GeneratedKeyHolder();    jdbcTemplate.update(new PreparedStatementCreator() {        public PreparedStatement createPreparedStatement(Connection connection)                throws SQLException {            PreparedStatement ps =                 connection.prepareStatement(youSQL,                     Statement.RETURN_GENERATED_KEYS);            ps.setString(1, post.name_author);            ...            return ps;        }    }, keyHolder);    long id = keyHolder.getKey().longValue();

I got this exception:

 org.springframework.dao.InvalidDataAccessApiUsageException: The getKey method should only be used when a single key is returned.  The current key entry contains multiple keys: ...

So I changed to :

PreparedStatement ps = connection.prepareStatement(youSQL, new String[]{"id"});

where "id" is

id serial not null primary key

And the problem is solved. So I supposed that using

prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

is not right here. The official guide is here, Chapter 13.2.8 :Retrieving auto-generated keys