【问题标题】:JOOQ getting an auto generated column value upon inserting it using the record, not returningJOOQ在使用记录插入时获取自动生成的列值,而不是返回
【发布时间】:2017-02-21 12:10:00
【问题描述】:

JOOQ 提供了非常好的功能来执行以下操作:

TableRecord tableRecord = dsl.newRecord(TABLE);
tableRecord.setSomeParam(...);
tableRecord.insert();

此时记录应该被插入到表中。

我们可以这样做:

tableRecord.getSomeParam(); // will return value above

但是,这个:

tableRecord.getId(); // NULL

总是返回null。这是设计使然吗?我们是否必须使用returning(TABLE.ID) 而不是Record 来获取自动生成的ID 值?如果在事务上下文中执行查询,这种行为会有所不同吗?


编辑:

我使用的是PostgreSQL 9.4.10,我的表定义类似如下:

CREATE TABLE item
(
    id bigserial NOT NULL,       
    name character varying(245),
    some_uuid uuid NOT NULL DEFAULT uuid_generate_v4(),
    CONSTRAINT item_pkey PRIMARY KEY (id),
    CONSTRAINT item_item_uuid_key UNIQUE (item_uuid)
)

附加信息:

  • PostgreSQL 驱动程序:“postgresql:postgresql>9.1-901.jdbc4”
  • JOOQ 版本:3.8.6

【问题讨论】:

  • 1) 你用的是什么数据库? 2) 你的桌子的 DDL 是什么?
  • 您好,Eder 先生:我刚刚更新了问题,提供了您问题的答案。感谢您的宝贵时间!
  • 有趣。这应该是开箱即用的,但我不能以这种方式重现它......你使用的是什么 jOOQ 版本?什么 JDBC 驱动程序和版本?你有没有通过 jOOQ 调试过,看看 jOOQ 是不是在某个地方走错了路?
  • 澄清一下,你的意思是你不能重现问题描述中的错误行为吗?我已经用版本号更新了票证描述。我还没有尝试通过库进行调试 - 我会尽快尝试这样做。感谢您到目前为止的回复!
  • 确实,我无法重现问题描述中的错误行为。我得到了我身边的那个 ID 值。无论如何,您是否考虑过升级您使用了 6 年的 PostgreSQL 驱动程序?

标签: java sql jooq


【解决方案1】:

使用store()方法(https://www.jooq.org/javadoc/3.2.0/org/jooq/UpdatableRecord.html#store()

自动生成的ID会在存储记录后刷新。

您也可以在insert 之后调用record.refresh(),然后您的记录将包含刷新的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 2020-08-04
    • 2011-12-28
    • 2021-12-23
    相关资源
    最近更新 更多