使用 JOOQ 更新 PostgreSQL 中的 jsonb 值

Posted

技术标签:

【中文标题】使用 JOOQ 更新 PostgreSQL 中的 jsonb 值【英文标题】:Update jsonb value in PostgreSQL using JOOQ 【发布时间】:2021-12-31 21:36:56 【问题描述】:

在我的 Java 项目中,我使用的是 JOOQ,我想更新 JSONB 值。 但是我的构建失败了。

我写了一个代码:

DSL.using(connection).update(USER_SETTINGS)
                .set(USER_SETTINGS.SETTING_VALUE, field("\"filtersValue\":\"page\":0,\"size\":100, \"visibleCount\":100", JSONB.class))
                .where(USER_SETTINGS.USER_ID.eq(98383L))
                .execute();

我收到了下一条消息:

org.jooq.exception.DataAccessException: 
SQL [update "sbcm_sys"."user_settings" set "setting_value" = "filtersValue":"page":0,"size":100, "visibleCount":100 where "sbcm_sys"."user_settings"."user_id" = ?]; ERROR: syntax err
or at or near ":"
  Position: 71
Caused by: org.postgresql.util.PSQLException: 
ERROR: syntax error at or near ":"
  Position: 71

我哪里做错了?

【问题讨论】:

我将 field() 更改为 val() 并且成功了! 【参考方案1】:

您使用的是DSL.field(String),它用于plain SQL templating,而您原本打算使用DSL.val(String),它用于bind values。

有关进一步说明,另请参阅此博客文章:https://blog.jooq.org/whats-a-string-in-the-jooq-api/

【讨论】:

以上是关于使用 JOOQ 更新 PostgreSQL 中的 jsonb 值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jOOQ 更新 PostgreSQL 上复合列的单个子字段?

jOOQ:比较 uuid(来自 postgresql)和字符串(类中的用户 id)

JOOQ - 更新新添加的列

JOOQ快速上手(基于springboot 和 postgresql)

PostgreSQL 函数 + 在 jOOQ 中强制转换

使用 jOOQ 在 PostgreSQL 中进行 UPSERT