[英]Jooq INSERT...ON CONFLICT DO UPDATE...RETURNING doesn't return value or catch the database exception
使用 Jooq 3.13.5,Postgresql 10。
期望插入查询会将行插入到数据库表中(如果它不存在)并无论如何返回id列。
桌子:
CREATE descriptor_table (id 序列主键, name text unique );
工作 SQL 查询:
INSERT INTO descriptor_table (name)
VALUES('a name')
ON CONFLICT("name")
DO UPDATE SET name=EXCLUDED.name
RETURNING id;
爪哇代码:
DSLContext dsl = jooqProvider.getDSLContext();
dsl.transaction(configuration -> {
MyRecord
idValue =
DSL.using(configuration)
.insertInto(DESCRIPTOR_TABLE)
.set(DESCRIPTOR_TABLE.NAME, "a name")
.onConflict(Keys.DESCRIPTOR_TABLE_NAME_KEY.getFieldsArray())
.doUpdate()
.set(DESCRIPTOR_TABLE.NAME, "EXCLUDED.name")
.where(DESCRIPTOR_TABLE.NAME.eq("a name")))
.returning(DESCRIPTOR_TABLE.ID)
.fetchOne();
}
结果 MyRecord 值为空。
您的字符串"EXCLUDED.name"
只是一个字符串绑定变量,而不是一个表达式。 这与将NAME
列设置为例如"Mike"
或像您的其他绑定变量"a name"
没有什么不同。
如果您想要一个 普通的 SQL表达式,请使用DSL.field(String, DataType)
或类似的重载:
.set(DESCRIPTOR_TABLE.NAME, field("EXCLUDED.name", DESCRIPTOR_TABLE.NAME.getDataType()))
请注意,您的 jOOQ 查询有一个where()
子句,与您的 SQL 查询不同...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.