使用 jooq 在 UPDATE 中使用原始值表达式

Using raw value-expressions in UPDATE with jooq

这是我要执行的查询:

UPDATE TABLE users SET metadata = metadata - 'keyA' - 'keyB'
    WHERE <condition>;

这里,metadatajsonb 类型,- 运算符从 JSON 对象中删除一个键。但是,当我在 jooq 中执行此操作时:

this.ctx.update(Tables.USERS)
    .set(Tables.USERS.METADATA, "metadata-'keyA'-'keyB'")
    .where(<condition>)
    .execute();

我收到一条错误消息,指出 valueCHARACTER VARYING 而不是 JSONB,我猜这是因为查询是使用绑定值创建的,然后正在尝试插入整个字符串而不是作为表达式。

如何在 jooq 中执行这个值表达式?

您传递给 set 方法的内容:

"metadata-'keyA'-'keyB'"

... 不是直接注入结果 SQL 字符串的表达式。它是一个字符串类型的绑定变量(即 VARCHAR)。最简单的方法是使用 "plain SQL":

.set(USERS.METADATA, field(
     "{0} - {1} - {2}", 
     USERS.METADATA.getDataType(),
     USERS.METADATA, val("keyA"), val("keyB")
))

有关将 "plain SQL" 与 jOOQ 一起使用的更多信息,请参阅手册的这一部分: http://www.jooq.org/doc/latest/manual/sql-building/plain-sql