INSERT..RETURNING 在 JOOQ 中不起作用

Posted

技术标签:

【中文标题】INSERT..RETURNING 在 JOOQ 中不起作用【英文标题】:INSERT..RETURNING is not working in JOOQ 【发布时间】:2017-05-06 22:56:39 【问题描述】:

我有一个 MariaDB 数据库,我正在尝试在我的表 users 中插入一行。它有一个生成的id,我想在插入后得到它。我见过this,但它对我不起作用:

public Integer addNewUser(String name) 
    Record record = context.insertInto(table("users"), field("name"))
        .values(name)
        .returning(field("id"))
        .fetchOne();
    return record.into(Integer.class);

已插入新行,但 record 始终为 null。我没有使用 JOOQ 代码生成。

【问题讨论】:

【参考方案1】:

这是 jOOQ 3.9 中的一个已知限制:https://github.com/jOOQ/jOOQ/issues/2943

在使用纯 SQL 时,您目前无法在 jOOQ 中使用 RETURNING 子句,因为 jOOQ 需要知道标识列名称才能绑定到 JDBC(在大多数数据库中)。不幸的是,将ID 列传递给RETURNING 子句是不够的,因为不能保证这是标识列。您还可以将几列传递给 RETURNING 子句,以防 jOOQ 不知道哪一列是标识列。

【讨论】:

感谢您的回答。所以,我需要查询最大值并加1,对吗?还有其他方法可以利用自动增量吗? @bigdestroyer:我不会查询最大值,因为这可能会导致竞争条件。我会再次按名称搜索用户,因为它可能是唯一的。或者,您使用 jOOQ 代码生成器,在这种情况下,此查询将正确返回 id 好主意。谢谢!

以上是关于INSERT..RETURNING 在 JOOQ 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

PGSQL CTE 递归 INSERT RETURNING 自动增量

Sybase JDBC 获取生成的密钥

JOOQ + JPA 实体

jooq + scala 代码生成:对象 AbstractKeys 中的方法 createIndex 无法在对象 org.jooq.impl.AbstractKeys 中访问

JOOQ 和 TimescaleDB - 如何在 JOOQ 中实现基本的 time_bucket 语句

如何在 JOOQ 中使用 toChar 函数?