使用jOOQ和PostgreSQL串行和RETURNING返回一个值

时间:2014-04-14 15:47:40

标签: java postgresql sql-insert jooq sql-returning

我有一个PostgreSQL uris表,其中包含serial(autoincrementing)uri_id列和字符串uri列。我可以使用jOOQ查询表:

createDSLContext().select(fieldByName("uri_id")).from(tableByName("uris"))
    .where(fieldByName("uri").equal(uri.toString())).fetchOne(0, Integer.class))

返回Java Integer。但是当我插入一个新的URI时,我想要取回生成的uri_id密钥,所以我试试这个:

createDSLContext().insertInto(tableByName("uris"), fieldByName("uri"))
    .values(uri.toString()).returning(fieldByName("uri_id")).fetchOne().getValue(0, Integer.class)

这次我收到错误:

Exception in thread "main" java.lang.IllegalArgumentException: Field 0 is not contained in list

就像测试一样,我尝试在uri_id语句中为INSERT提供文字值,但仍然出错。

看起来正在生成正确的SQL:

insert into "uris" ("uri") values ('http://example.com/') returning "uri_id"

但是返回的记录是空的。即使我在insert语句中指定文字uri_id也是如此。

如何使用jOOQ从PostgreSQL INSERT语句中检索自动生成的列?

1 个答案:

答案 0 :(得分:1)

jOOQ user group上还会详细讨论这个问题。

本质上,您遇到了一个已知问题,当使用纯SQL而不是生成的表时,jOOQ 3.3(及更低版本)当前不支持RETURNING子句。这是问题参考:

https://github.com/jOOQ/jOOQ/issues/2374