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

时间:2016-08-31 13:21:47

标签: java sql 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();

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

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

1 个答案:

答案 0 :(得分:1)

您传递给set方法的内容:

"metadata-'keyA'-'keyB'"

...不是直接注入生成的SQL字符串的表达式。它是String类型的绑定变量(即VARCHAR)。最简单的方法是使用“普通SQL”:

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

有关在jOOQ中使用“纯SQL”的更多信息,请参阅本手册的这一部分: http://www.jooq.org/doc/latest/manual/sql-building/plain-sql