我有一个SQL查询,用于更新类型为status
的列中的data
值
jsonb
在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中提供的答案
答案 0 :(得分:1)
在UPDATE
语句中,必须在SET
子句的两侧都匹配数据类型。即SAMPLE.DATA
的类型为Field<T>
,因此您要为其设置的表达式的类型也必须为Field<T>
。
我假设SAMPLE.DATA
是Field<JSONB>
,所以写就足够了
.set(SAMPLE.DATA, field("json_set(...)", JSONB.class))
请注意,jOOQ 3.12引入了此JSONB
类型。在以前的版本中,缺少JSON
和JSONB
类型的现成jOOQ表示形式,jOOQ代码生成器可能已经为您的Field<Object>
生成了SAMPLE.DATA
类型列,以防您的语句被编译。