问题描述
使用Jooq 3.13.5和Postgresql 10。
期望的是,如果插入查询尚不存在,则插入查询会将其插入数据库表中,并返回 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
列设置为例如没有什么不同。 "Mike"
或其他绑定变量"a name"
。
如果要使用plain SQL表达式,请使用DSL.field(String,DataType)
或类似的重载:
.set(DESCRIPTOR_TABLE.NAME,field("EXCLUDED.name",DESCRIPTOR_TABLE.NAME.getDataType()))
请注意,与SQL查询不同,您的jOOQ查询具有where()
子句。