在jOOQ更新中使用jsonb_set

时间:2019-10-31 19:09:15

标签: postgresql kotlin jooq

我有一个SQL查询,用于更新类型为status的列中的datajsonb在Postgresql中如下所示:

update sample
set updated = now(),
    data = jsonb_set(data, '{status}', jsonb 'CANCELLED', true)
where id = 11;

我需要将其转换为我的Kotlin项目中正在工作的jOOQ查询... 到目前为止:

jooq.update(Tables.SAMPLE)
        .set(Tables.SAMPLE.UPDATED, OffsetDateTime.now())
        .set(Tables.SAMPLE.DATA, field("jsonb_set(data, '{status}', jsonb '\"CANCELLED\"', true)"))
        .where(Tables.SAMPLE.ID.eq(id))
        .execute()

但是第二个set失败,并显示 提供的参数错误消息... set的正确签名是什么 我可以在这里使用?

我将jOOQ语法基于Lukas Eder在Using raw value-expressions in UPDATE with jooq中提供的答案

1 个答案:

答案 0 :(得分:1)

UPDATE语句中,必须在SET子句的两侧都匹配数据类型。即SAMPLE.DATA的类型为Field<T>,因此您要为其设置的表达式的类型也必须为Field<T>

我假设SAMPLE.DATAField<JSONB>,所以写就足够了

.set(SAMPLE.DATA, field("json_set(...)", JSONB.class))

请注意,jOOQ 3.12引入了此JSONB类型。在以前的版本中,缺少JSONJSONB类型的现成jOOQ表示形式,jOOQ代码生成器可能已经为您的Field<Object>生成了SAMPLE.DATA类型列,以防您的语句被编译。