将 Spring 的 KeyHolder 与以编程方式生成的主键结合使用
我正在使用 Spring 的 NamedParameterJdbcTemplate 来执行插入到表中的操作。该表使用序列上的 NEXTVAL 来获取主键。然后我希望将生成的 ID 传回给我。我正在使用 Spring 的 KeyHolder 实现,如下所示:
KeyHolder key = new GeneratedKeyHolder();
jdbcTemplate.update(Constants.INSERT_ORDER_STATEMENT, params, key);
但是,当我运行此语句时,我得到:
org.springframework.dao.DataRetrievalFailureException: The generated key is not of a supported numeric type. Unable to cast [oracle.sql.ROWID] to [java.lang.Number]
at org.springframework.jdbc.support.GeneratedKeyHolder.getKey(GeneratedKeyHolder.java:73)
我缺少什么想法吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
刚刚解决了一个类似的问题 - 对于 Oracle,您需要使用另一种方法(来自
NamedParameterJdbcOperations
) -keyColumnNames 包含自动生成的列,在我的例子中只是 [“Id”]。否则你得到的只是 ROWID。请参阅Spring 文档 了解详细信息。
Just solved a similar issue - with Oracle you need to use another method (from
NamedParameterJdbcOperations
) -with keyColumnNames containing auto-generated columns, in my case just ["Id"]. Otherwise all you get is ROWID. See Spring doc for details.
您必须执行
JdbcTemplate.update(PreparedStatementCreator p, KeyHolder k)
。从数据库返回的密钥将被注入到
KeyHolder
参数对象中。示例:
可以找到更多信息 此处。
You have to execute the
JdbcTemplate.update(PreparedStatementCreator p, KeyHolder k)
.The key returned from the database will be injected into the
KeyHolder
parameter object.An example:
More information can be found here in the reference documentation.
没有详细说明@konstantin 的答案:这是一个完整的示例:
假设数据库是Oracle,存储生成的ID的列名称是“GENERATED_ID”(可以是任何名称)。
注意:在此示例中,我使用的是 NamedParameterJdbcTemplate.update(....) ,而不是 Spring 的 JdbcTemplate 类。
No elaborate on @konstantin answer: Here is a fully working example:
Assuming Database is Oracle and column name which store generated Id is "GENERATED_ID" ( Can be any name).
NOTE: I used NamedParameterJdbcTemplate.update(....) In this example NOT JdbcTemplate class of Spring.
与MySQL
With MySQL
我认为您在
JdbcTemplate
上使用了错误的方法。唯一与您的代码片段匹配的update
方法是如果是这样,您将
params
和key
作为两个参数传递-element vargs 数组,而JdbcTemplate
将key
视为普通绑定参数,并错误解释它。JdbcTemplate
上唯一采用KeyHolder
的公共update
方法是因此,您需要重新编写代码才能使用它。
I think you're using the wrong method on
JdbcTemplate
. The only one of theupdate
methods that would seem to match your code fragment isIf so, you're passing
params
andkey
as a two-element vargs array, andJdbcTemplate
is treatingkey
as a normal bind parameters, and mis-interpreting it.The only public
update
method onJdbcTemplate
that takes aKeyHolder
isSo you'll need to rephrase your code to use that.