You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用jOOQ实现PostgreSQL JSONB列的||拼接更新操作?

可行的替代方案

由于jOOQ官方尚未原生支持PostgreSQL的JSONB拼接运算符(||),你可以通过以下几种方式实现需求:

1. 使用jOOQ的原生SQL模板(DSL.sql())

这是最直接的方式,直接将拼接逻辑以原生SQL片段的形式嵌入jOOQ查询中:

INSERT ... ON CONFLICT 示例

dsl.insertInto(FOOBAR, FOOBAR.ID, FOOBAR.ADDRESS)
   .values("1234", DSL.jsonb("[\"a\", \"b\"]"))
   .onConflict(FOOBAR.ID)
   .doUpdate()
   .set(FOOBAR.ADDRESS, DSL.sql("{0} || {1}", FOOBAR.ADDRESS, DSL.jsonb("[\"C\"]")))
   .where(FOOBAR.ID.eq("1234"))
   .execute();

显式UPDATE示例

dsl.update(FOOBAR)
   .set(FOOBAR.ADDRESS, DSL.sql("{0} || {1}", FOOBAR.ADDRESS, DSL.jsonb("[\"D\"]")))
   .where(FOOBAR.ID.eq("1234"))
   .execute();

2. 封装可复用的JSONB拼接方法

为了避免重复编写原生SQL模板,可以封装一个工具方法,提高代码可读性和维护性:

import org.jooq.Field;
import org.jooq.JSONB;
import static org.jooq.impl.DSL.sql;

public class JsonbUtils {
    public static Field<JSONB> concat(Field<JSONB> left, Field<JSONB> right) {
        return sql("{0} || {1}", left, right).as(JSONB.class);
    }
}

使用时只需调用该方法:

// INSERT ... ON CONFLICT场景
.set(FOOBAR.ADDRESS, JsonbUtils.concat(FOOBAR.ADDRESS, DSL.jsonb("[\"C\"]")))

// UPDATE场景
.set(FOOBAR.ADDRESS, JsonbUtils.concat(FOOBAR.ADDRESS, DSL.jsonb("[\"D\"]")))

3. 使用PostgreSQL的jsonb_array_cat函数(仅适用于数组拼接)

如果你仅需要拼接JSONB数组,PostgreSQL的jsonb_array_cat函数与||运算符效果完全一致,可以直接通过jOOQ调用:

dsl.update(FOOBAR)
   .set(FOOBAR.ADDRESS, DSL.field("jsonb_array_cat({0}, {1})", JSONB.class, 
        FOOBAR.ADDRESS, DSL.jsonb("[\"D\"]")))
   .where(FOOBAR.ID.eq("1234"))
   .execute();

注意:此方法仅适用于数组类型的JSONB拼接,若需要拼接JSON对象或其他JSONB类型,建议使用前两种方案。

内容的提问来源于stack exchange,提问作者Krish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 06:25:33