【问题标题】:Using jsonb_set in update with jOOQ在 jOOQ 的更新中使用 jsonb_set
【发布时间】:2020-02-27 04:43:42
【问题描述】:

我有一个用于更新 data 类型列中的 status 值的 sql 查询 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 中提供的答案

【问题讨论】:

  • 你为什么将CANCELLED 包裹在"CANCELLED" 中?
  • 这是一个很好的问题......直到你指出这一点,我才意识到这一点。这是一个疏忽。

标签: postgresql kotlin jooq


【解决方案1】:

UPDATE 语句中,您必须在两侧匹配SET 子句中的数据类型。 IE。 SAMPLE.DATAField<T> 类型,因此您设置的表达式也必须是 Field<T> 类型。

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

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

注意 jOOQ 3.12 引入了这个 JSONB 类型。在以前的版本中,对于 JSONJSONB 类型缺少任何开箱即用的 jOOQ 表示,jOOQ 代码生成器可能已经为您的 SAMPLE.DATA 列生成了一个 Field<Object> 类型,在这种情况下,您的语句会编译的。

【讨论】:

  • 它的工作原理与您描述的完全一样,谢谢!只需匹配正确的列类型即可。
猜你喜欢
  • 2016-12-17
  • 2016-12-24
  • 2022-01-24
  • 1970-01-01
  • 2021-03-31
  • 2021-12-31
  • 2019-06-05
  • 2015-03-07
  • 2017-06-29
相关资源
最近更新 更多