我知道这是一个重复的问题,但其他页面上的解决方案对我不起作用。
我有一个Oracle数据库,我想获取插入记录的ID(主键),但我无法做到。以下是我的代码和错误信息。
org.springframework.dao.DataRetrievalFailureException: 生成的密钥不是受支持的数字类型。无法将[oracle.sql.ROWID]强制转换为[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();
}
当我以调试模式运行应用程序时,我发现 holder 变量 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)
);