【问题标题】:Jooq INSERT...ON CONFLICT DO UPDATE...RETURNING doesn't return value or catch the database exceptionJooq INSERT...ON CONFLICT DO UPDATE...RETURNING 不返回值或捕获数据库异常
【发布时间】:2021-02-05 21:31:50
【问题描述】:

使用 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。

【问题讨论】:

    标签: java postgresql jooq postgresql-10


    【解决方案1】:

    您的字符串"EXCLUDED.name" 只是一个字符串绑定变量,而不是一个表达式。这与将 NAME 列设置为 e.g. 没有什么不同。 "Mike" 或像您的其他绑定变量 "a name"

    如果您想要plain SQL 表达式,请使用DSL.field(String, DataType) 或类似的重载:

    .set(DESCRIPTOR_TABLE.NAME, field("EXCLUDED.name", DESCRIPTOR_TABLE.NAME.getDataType()))
    

    请注意,您的 jOOQ 查询有一个 where() 子句,这与您的 SQL 查询不同...

    【讨论】:

      猜你喜欢
      • 2018-08-02
      • 2019-09-20
      • 1970-01-01
      • 1970-01-01
      • 2021-02-16
      • 2023-02-04
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      相关资源
      最近更新 更多