gpt4 book ai didi

java - 使用Spring JDBCTemplate在数据库表中插入新记录后如何获取生成的ID?

转载 作者:行者123 更新时间:2023-12-01 14:17:43 25 4
gpt4 key购买 nike

我知道这是一个重复的问题,但其他页面上的其他解决方案对我不起作用。

我有一个 Oracle 数据库,我想获取插入的记录 ID(主键),但我无法这样做。下面是错误和我的代码。

org.springframework.dao.DataRetrievalFailureException: The generated key is not of a supported numeric type. Unable to cast [oracle.sql.ROWID] to [java.lang.Number]


String query = "INSERT INTO JOBS (USERNAME, CREATED_ON, STATUS, JOBTYPE, DATA) " + "VALUES (?, ?, ?, ?, ?)";

try {

KeyHolder holder = new GeneratedKeyHolder();

jdbcTemplate.update(new PreparedStatementCreator() {

@Override
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
PreparedStatement ps = con.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
ps.setString(1, "username");
ps.setTimestamp(2, new Timestamp(System.currentTimeMillis()));
ps.setString(3, "status");
ps.setString(4, "jobtype");
ps.setString(5, "job-data");

return ps;
}
}, holder);
System.out.println("Holder tostring: " + holder.toString());
System.out.println("Ran an update statement and got generated key. Key = " + holder.getKey().intValue());
System.out.println("Key: " + holder.getKey().longValue());
return true;
} catch (DataAccessException e) {
System.err.println("Exception thrown inserting record into table. Error: " + e.getMessage());
e.printStackTrace();
}

当我在 Debug模式下运行应用程序时,我看到持有者变量 keyList 值为: [{ROWID=AAAKy2AAAAALRgdAAD}]我没有得到插入的记录 ID。

创建表脚本是:
CREATE TABLE JOBS (
ID INTEGER GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1),
USERNAME VARCHAR2(20) NOT NULL,
CREATEDON TIMESTAMP NOT NULL,
STATUS VARCHAR2(10) NOT NULL,
JOBTYPE VARCHAR2(15) NOT NULL,
DATA VARCHAR2(1000 CHAR) NOT NULL,

PRIMARY KEY(ID)
);

最佳答案

当您使用 con.prepareStatement(query, Statement.RETURN_GENERATED_KEYS) ,Oracle JDBC 驱动程序将不会返回 id 的值。列,但它将返回 ROW_ID(标识特定行的伪列),以允许您自己检索值。

从历史上看,Oracle 驱动程序是这样做的,因为以前的 Oracle 版本没有标识列。

相反,您应该使用:

con.prepareStatement(query, new String[] { "ID" });

它指示 Oracle 返回指定列的值。

关于java - 使用Spring JDBCTemplate在数据库表中插入新记录后如何获取生成的ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47098003/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com