我想从行插入中检索自动生成的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
应该在插入行时调用
编辑:
插入行时正确创建了自动增量值
任何想法 ?
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支持自动生成的密钥,但我得到了这个异常: 编辑:我尝试了此操作以获取自动生成的密钥: 但我得到一个: 插入行时会正确创建自动递增值 知道吗?
问题内容: 如何使用MyBatis获取插入的生成密钥?我阅读了许多有关此问题的页面,但仍然被屏蔽,请问有人可以帮助我吗?这是我的代码: 桌子: 道: mapper.java: mapper.xml 怎么了?如何获得此插入的生成的密钥?谢谢! 问题答案: 如果要获取生成的主键,则应通过或传递参数。 调用映射方法时,将值映射。
数据访问对象: 有没有可能在上述方法本身中完成插入后返回用户的id,而不需要编写单独的select查询?
问题内容: 我正在使用JDBC批处理插入插入许多记录。有什么方法可以获取每个记录的生成密钥吗?我可以配合批量插入使用吗? 我在用 我正在考虑与循环一起使用以获得所需的结果。还有其他解决方案吗? 问题答案: 似乎Oracle 12c不支持根据以下页面将自动生成的密钥与批处理更新结合使用: http://docs.oracle.com/cd/E16655_01/java.121/e17657/jdbc
正如这里讨论的,Android Room-使用auto generate获取新插入行的id,可以从新插入的对象获取id。 但是如何在MVVM模式中从DAO到我的活动类都获得这个ID呢? 上面的一些答案建议使用rxjava和类似的东西:
问题内容: 我将SQLite与Android一起使用,我想知道获取插入的行的生成ID的最佳方法。 我认为有一个解决方案可以在包含之后进行搜索,但它并不是最好的方法。 问题答案: 该方法返回刚插入的行或插入期间发生错误的行。 db在哪里。