使用 jooq 在 UPDATE 中使用原始值表达式
Using raw value-expressions in UPDATE with jooq
这是我要执行的查询:
UPDATE TABLE users SET metadata = metadata - 'keyA' - 'keyB'
WHERE <condition>;
这里,metadata
是 jsonb
类型,-
运算符从 JSON 对象中删除一个键。但是,当我在 jooq 中执行此操作时:
this.ctx.update(Tables.USERS)
.set(Tables.USERS.METADATA, "metadata-'keyA'-'keyB'")
.where(<condition>)
.execute();
我收到一条错误消息,指出 value
是 CHARACTER 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
这是我要执行的查询:
UPDATE TABLE users SET metadata = metadata - 'keyA' - 'keyB'
WHERE <condition>;
这里,metadata
是 jsonb
类型,-
运算符从 JSON 对象中删除一个键。但是,当我在 jooq 中执行此操作时:
this.ctx.update(Tables.USERS)
.set(Tables.USERS.METADATA, "metadata-'keyA'-'keyB'")
.where(<condition>)
.execute();
我收到一条错误消息,指出 value
是 CHARACTER 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