Java 如何以通用方式获取新记录的id?(带博士后的JOOQ 3.4)

Java 如何以通用方式获取新记录的id?(带博士后的JOOQ 3.4),java,sql,postgresql,jooq,Java,Sql,Postgresql,Jooq,对于JOOQ3.4,我不知道如何做到这一点(对于Postgresql): 但如果我不知道哪张表是正确的,比如: TableImpl<?> tableImpl; Query query = dsl.insertInto(tableImpl) .set(tableImpl.getIdentity(), tableImpl.getIdentity().getSequence().nextval()); 这是可行的,但我仍然不知道如何从TableImpl对象获取序列名 有解决办法

对于JOOQ3.4,我不知道如何做到这一点(对于Postgresql):

但如果我不知道哪张表是正确的,比如:

TableImpl<?> tableImpl;

Query query = dsl.insertInto(tableImpl)
    .set(tableImpl.getIdentity(), tableImpl.getIdentity().getSequence().nextval());
这是可行的,但我仍然不知道如何从TableImpl对象获取序列名

有解决办法吗?还是我的方法有问题

在纯SQL中,我会这样做:

insert into table_A (id) VALUES nextval('table_A_id_seq');
insert into table_B (table_A_id, some_val) VALUES (currval('table_A_id_seq'), some_val);

因此,我需要该id的值或引用,以便以后使用为插入的记录生成的id作为默认值,但我不想设置任何其他值。

jOOQ目前没有任何方法将表与其隐式使用的标识列序列相关联。这是因为序列是在创建表时生成的,但它没有正式连接到该表

通常,您不必在PostgreSQL数据库中显式设置列的
serial
值。它是在插入时自动生成的。就DDL而言,这意味着:

创建表tablename(
colname系列
);
等同于指定:

创建序列tablename\u colname\u seq;
创建表tablename(
colname integer NOTNULL默认值nextval('tablename\u colname\u seq')
);
更改tablename.colname拥有的序列tablename\u colname\u seq;
以上内容摘自:

换句话说,只需在
INSERT
语句中省略
ID
值即可

“空”
INSERT
语句 请注意,如果要创建一个“空的”
INSERT
语句,即一个完全不传递值的语句,用生成的ID生成一个新列,则可以使用
DEFAULT values
子句

使用SQL

插入到tablename默认值中
使用jOOQ

DSL.使用(配置)
.insertInto(表名)
.defaultValues()
.execute();
返回ID 请注意,PostgreSQL本机支持
插入。。返回jOOQ也支持的
子句:

使用SQL

插入tablename(…)值(…)返回ID
使用jOOQ

DSL.使用(配置)
.insertInto(表名,…)
.价值观(…)
.returning(TABLENAME.ID)
.fetchOne();

感谢您的快速回答。我知道PostgreSQL会在插入时自动生成ID,但我希望这些ID值或在其他插入中使用的参考。我将编辑问题并添加一个示例。@Zoltan.Tamasi:我明白了。可能正在调用
INSERT。。返回
会有帮助吗?查看更新的答案请查看问题末尾的更新。感谢您让我了解.defaultValues()方法。使用.returning(TABLE.ID)这些几乎解决了我的问题。如果我不需要执行第一次插入来获取id并显式使用该id,而是能够以某种方式在批插入中实现这一点,那将是最好的。@Zoltan.Tamasi:好吧,jOOQ不提供表到序列的映射。但是你知道你的数据库,所以你可以为它创建一个配置。。。
dsl.insertInto(tableImpl)
    .set(DSL.field("id"), 
        tableImpl.getSchema().getSequence("table_id_seq").nextval())
insert into table_A (id) VALUES nextval('table_A_id_seq');
insert into table_B (table_A_id, some_val) VALUES (currval('table_A_id_seq'), some_val);