使用Spring JDBC在oracle数据库中插入新行时如何检索生成的主键?

发布于 2025-01-07 15:44:29 字数 1020 浏览 1 评论 0原文

下面是我用来在数据库中保存记录然后获取生成的主键的代码。

public void save(User user) {
    // TODO Auto-generated method stub
    Object[] args = { user.getFirstname(), user.getLastname(),
            user.getEmail() };
    int[] types = { Types.VARCHAR, Types.VARCHAR, Types.VARCHAR };

    SqlUpdate su = new SqlUpdate();

    su.setJdbcTemplate(getJdbcTemplate());
    su.setSql(QUERY_SAVE);

    setSqlTypes(su, types);

    su.setReturnGeneratedKeys(true);
    su.compile();

    KeyHolder keyHolder = new GeneratedKeyHolder();

    su.update(args, keyHolder);

    int id = keyHolder.getKey().intValue();

    if (su.isReturnGeneratedKeys()) {
        user.setId(id);
    } else {
        throw new RuntimeException("No key generated for insert statement");
    }
}

但它不起作用,它给了我以下错误。

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

该行已正确插入数据库中。我也可以在使用 MS SQL 数据库时获取生成的主键,但相同的代码不适用于 ORACLE 11G。

请帮忙。

Below is the code I am using to save a record in the database and then get the generated primary key.

public void save(User user) {
    // TODO Auto-generated method stub
    Object[] args = { user.getFirstname(), user.getLastname(),
            user.getEmail() };
    int[] types = { Types.VARCHAR, Types.VARCHAR, Types.VARCHAR };

    SqlUpdate su = new SqlUpdate();

    su.setJdbcTemplate(getJdbcTemplate());
    su.setSql(QUERY_SAVE);

    setSqlTypes(su, types);

    su.setReturnGeneratedKeys(true);
    su.compile();

    KeyHolder keyHolder = new GeneratedKeyHolder();

    su.update(args, keyHolder);

    int id = keyHolder.getKey().intValue();

    if (su.isReturnGeneratedKeys()) {
        user.setId(id);
    } else {
        throw new RuntimeException("No key generated for insert statement");
    }
}

But its not working, It gives me following error.

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

The row is being inserted in the database properly. As well I could get the generataed primary key when using MS SQL database but the same code is not working with the ORACLE 11G.

Please help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情深缘浅 2025-01-14 15:44:29

正如评论中所述,oracle rowid 是字母数字,因此无法转换为 int。

除此之外,您不应在代码中的任何位置使用生成的 rowid。这不是您在表上定义的主键。

MS SQL 可以选择将列声明为自动递增的主键。这是一个在oracle 中不起作用的功能。

我总是做的(无论数据库是否支持自动增量)如下:

select sequenceName.nextval from dual

前一个语句返回的值用作插入语句的主键。

insert into something (pk, ...) values (:pk,:.....)

这样我们总是能在插入后进行pk。

As in the comment, oracle rowid's are alpha numerical so can't be cast to an int.

Besides that, you should not use the generated rowid anywhere in your code. This is not the primary key that you defined on the table.

MS SQL has the option to declare a column as a primary key which auto-increments. This is a functionality that does not work in oracle.

What I always do (regardless if the db supports auto-increment) is the following:

select sequenceName.nextval from dual

The value returned by the previous statement is used as the primary key for the insert statement.

insert into something (pk, ...) values (:pk,:.....)

That way we always have the pk after the insert.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文