从 spring 3/PostgreSQL 8.4.9 中的行插入获取自动生成的键

新手上路,请多包涵

我想从行插入中检索自动生成的 ID,但我得到了 NullPointerException

这是代码:

 long result = 0;
        final String SQL = "INSERT INTO compte (prenom, nom, datenaissance, numtelephone) "
                            + " VALUES(?,?,?,?)";
        KeyHolder keyHolder = new GeneratedKeyHolder();
        int row= this.jdbcTemplate.update(new PreparedStatementCreator(){
            public PreparedStatement createPreparedStatement(Connection connection)
                throws SQLException {
                PreparedStatement ps =connection.prepareStatement(SQL);
                ps.setString(1, a.getSurname());
                ps.setString(2, a.getName());
                ps.setDate(3, a.getDob());
                ps.setString(4, a.getPhone());
                return ps;
            }
        },keyHolder);

        if (row > 0)
            result = keyHolder.getKey().longValue(); //line 72

这是 PostgreSQL 表:

 CREATE TABLE compte
(
  idcompte serial NOT NULL,
  prenom character varying(25) NOT NULL,
  nom character varying(25) NOT NULL,
  datenaissance date NOT NULL,
  numtelephone character varying(15) NOT NULL,
  CONSTRAINT pk_compte PRIMARY KEY (idcompte )
);

PostgreSQL 支持自动生成的键,但我得到这个异常:

 java.lang.NullPointerException
    at com.tante.db.JDBCUserAccountDAO.insertAccount(JDBCUserAccountDAO.java:72)

编辑:我试过这个来获取自动生成的密钥:

 result = jdbcTemplate.queryForLong("select currval('compte_idcompte_seq')");

但我得到一个 PSQLException

the current value (currval) of the sequence compte_idcompte_seq is not defined in this session ,虽然我认为插入行时应该调用 compte_idcompte_seq.NEXTVAL

编辑 :

插入行时正确创建自动增量值

任何想法 ?

原文由 Jerec TheSith 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 515
2 个回答
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();

请注意,在较新版本的 Postgres 中,您需要使用

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

代替

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

原文由 Artur 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用 Spring JDBC 从 INSERT 取回密钥的最简单方法是使用 SimpleJdbcInsert 类。您可以在 Spring 参考指南中的标题为 使用 SimpleJdbcInsert 检索自动生成的密钥 的部分中看到一个示例。

原文由 Paul 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题