【问题标题】:How to get generated ID after inserting new record in database table using Spring JDBCTemplate?使用 Spring JDBCTemplate 在数据库表中插入新记录后如何获取生成的 ID?
【发布时间】:2018-04-16 07:37:03
【问题描述】:

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

我有一个 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();
}

当我在调试模式下运行应用程序时,我看到持有者变量 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)
);

【问题讨论】:

  • 将 ID 从 INTEGER 更改为 NUMBER,您应该使用序列作为 ID。我不认为 oracle 使用 INTEGER 作为 data_type,除非您在数据库中将它们自己定义为自定义 data_type
  • 嗨@logger,我将我的Jobs 表ID 更改为Number 并删除了Generated Always ... 并创建了用于生成ID 的序列并在插入命令上触发以在插入命令上添加ID 值。我仍然面临同样的问题。

标签: java spring oracle jdbc


【解决方案1】:

当您使用con.prepareStatement(query, Statement.RETURN_GENERATED_KEYS) 时,Oracle JDBC 驱动程序不会返回 id 列的值,而是返回 ROW_ID(标识特定行的伪列),以便您检索珍惜自己。

过去,Oracle 驱动程序是这样做的,因为以前的 Oracle 版本没有标识列。

你应该使用:

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

指示Oracle返回指定列的值。

【讨论】:

    猜你喜欢
    • 2013-01-10
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 2013-12-06
    • 2012-10-04
    • 2018-10-08
    • 2016-07-07
    相关资源
    最近更新 更多