java - Jooq INSERT...ON CONFLICT DO UPDATE...RETURNING 不返回值或捕获数据库异常
问题描述
使用 Jooq 3.13.5、Postgresql 10。
期望是插入查询将在该行不存在的情况下将其插入到数据库表中,并且无论如何都返回id列。
桌子:
CREATE descriptor_table(id 序列主键,名称文本唯一);
工作 SQL 查询:
INSERT INTO descriptor_table (name)
VALUES('a name')
ON CONFLICT("name")
DO UPDATE SET name=EXCLUDED.name
RETURNING id;
Java代码:
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 值为 null。
解决方案
您的字符串"EXCLUDED.name"
只是一个字符串绑定变量,而不是表达式。NAME
这与将列设置为 eg"Mike"
或 like your other bind variable没有什么不同"a name"
。
如果您想要一个普通的 SQL表达式,请使用DSL.field(String, DataType)
或类似的重载:
.set(DESCRIPTOR_TABLE.NAME, field("EXCLUDED.name", DESCRIPTOR_TABLE.NAME.getDataType()))
请注意,您的 jOOQ 查询有一个where()
子句,与您的 SQL 查询不同...
推荐阅读
- linux - 故障处理程序(内核)返回线程进程是否终止
- assembly - 我似乎无法让这个 16 位内存检测汇编代码工作
- powershell - 处理 powershell 数组中的项目 - 多个项目
- python - 删除所有键后大 python 字典的内存占用
- swiftui - WKWebView 自定义链接可在 SwiftUI 中打开 WhatsApp 等应用
- java - Java 相当于 Scala 的未来?
- python - Python Selenium - 有什么方法可以在这个文本框中发送文本?
- python - 重命名包含子字符串的列 - Pandas
- python - Cmd 提示符执行不带 py 的代码,但忽略命令行参数(自动化无聊的东西)
- c++ - 无法在 OS X Big Sur 上编译 c++,“ld: library not found for -lgcc_s.10.4”