Jooq INSERT ... ON CONFLICT做更新... RETURNING不返回值或捕获数据库异常

问题描述

使用Jooq 3.13.5和Postgresql 10。

期望的是,如果插入查询尚不存在,则插入查询会将其插入数据库表中,并返回 id 列。

表格:

创建描述符表( 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()子句。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...