当前位置: 首页 > 知识库问答 >
问题:

在Spring3/PostgreSQL 8.4.9中通过行插入获得自动生成的密钥

吉凯捷
2023-03-14

我想从行插入中检索自动生成的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
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:

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

知道吗?

共有1个答案

左恺
2023-03-14
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);
 类似资料:
  • 问题内容: 我想从行插入中检索自动生成的ID,但得到一个 这是代码: 这是PostgreSQL表: PostgreSQL支持自动生成的密钥,但是我得到了这个异常: 编辑:我试图这样做以获得自动生成的密钥: 但我得到了: ,虽然我认为 应该在插入行时调用 编辑: 插入行时正确创建了自动增量值 任何想法 ? 问题答案: 请注意,在较新版本的Postgres中,您需要使用 代替

  • 问题内容: 如何使用MyBatis获取插入的生成密钥?我阅读了许多有关此问题的页面,但仍然被屏蔽,请问有人可以帮助我吗?这是我的代码: 桌子: 道: mapper.java: mapper.xml 怎么了?如何获得此插入的生成的密钥?谢谢! 问题答案: 如果要获取生成的主键,则应通过或传递参数。 调用映射方法时,将值映射。

  • 数据访问对象: 有没有可能在上述方法本身中完成插入后返回用户的id,而不需要编写单独的select查询?

  • 问题内容: 我已经在python中使用xml.etree.ElementTree创建了一个xml文件。然后我用 将文档写到文件中。 但是,当我使用文本编辑器打开文件名时,标记之间没有换行符。一切都是一条大线 我如何以“漂亮打印”格式写出文档,以便所有xml标记之间都有新行(以及希望的缩进等)? 问题答案: 我认为最简单的解决方案是切换到lxml库。在大多数情况下,您只需将导入从更改为或类似即可。

  • 问题内容: 请考虑下表: 我将以这种方式向其插入条目。 如何知道为它创造了什么价值?仅使用该字段执行SELECT是无效的,因为可能会有重复的条目。 问题答案: 通过普通的SQL: 有关详细信息,请参见手册:http : //db.apache.org/derby/docs/10.7/ref/rrefidentityvallocal.html 从Java类(通过JDBC)执行此操作时,可以在通过适当

  • 我有两个表A(id,col1,col2)和B(col3,col4,col5,col6) 这引发错误 为什么postgres不自动为列“id”生成值?如果我从表B中提供“id”,或者如果我插入单行(没有select)并为自动生成的列提供“default”关键字,查询就可以工作。 编辑:表创建查询