繁体   English   中英

Jooq INSERT...ON CONFLICT DO UPDATE...RETURNING 不返回值或捕获数据库异常

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM