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

如何在jOOQ的WHERE子句中使用PostgreSQL JSON列

用jOOQ实现PostgreSQL JSON列的IN查询方案

方案1:完全模拟原生SQL的TEXT转换逻辑

你的原生SQL核心是把JSON列转成TEXT后匹配固定字符串集合,在jOOQ里可以通过cast()方法实现类型转换,再结合in()构造条件:

import org.jooq.DSLContext;
import static com.your.generated.tables.DbTable.DB_TABLE;

// 定义要匹配的JSON文本集合(注意Java里的双引号转义)
var targetJsonTexts = Set.of("[\"USD\"]", "[\"AUD\"]", "[\"EUR\"]");

// 构建查询
var result = dsl.selectFrom(DB_TABLE)
    .where(DB_TABLE.SUPPORTED_CURRENCIES.cast(String.class).in(targetJsonTexts))
    .fetch();

这个写法和你原生SQL的逻辑完全一致,会生成几乎相同的执行语句。

方案2:更严谨的JSON值匹配(推荐)

直接转TEXT匹配依赖JSON的字符串格式完全一致(比如不能有多余空格、元素顺序必须相同),更严谨的方式是直接用PostgreSQL的JSON值比较逻辑,jOOQ支持直接构造JSON值来匹配:

方式A:手动传入JSON字符串

import org.jooq.DSLContext;
import static org.jooq.impl.DSL.json;
import static com.your.generated.tables.DbTable.DB_TABLE;

var result = dsl.selectFrom(DB_TABLE)
    .where(DB_TABLE.SUPPORTED_CURRENCIES.in(
        json("[\"USD\"]"),
        json("[\"AUD\"]"),
        json("[\"EUR\"]")
    ))
    .fetch();

方式B:用jOOQ构造JSON数组(避免手动转义)

如果不想手动写JSON字符串,可以用jOOQ的jsonArray()方法构造数组,更安全:

import org.jooq.DSLContext;
import static org.jooq.impl.DSL.jsonArray;
import static org.jooq.impl.DSL.val;
import static com.your.generated.tables.DbTable.DB_TABLE;

var result = dsl.selectFrom(DB_TABLE)
    .where(DB_TABLE.SUPPORTED_CURRENCIES.in(
        jsonArray(val("USD")),
        jsonArray(val("AUD")),
        jsonArray(val("EUR"))
    ))
    .fetch();

这种方式会生成supported_currencies = '["USD"]'::json这类的条件,PostgreSQL会按JSON值语义比较,无需担心格式差异。

常见失败原因排查

如果之前尝试失败,大概率是以下问题:

  • 没有正确使用cast()转换JSON列到TEXT类型,直接用字符串匹配JSON列导致类型不兼容
  • Java字符串中的双引号没有转义,导致生成的SQL里的JSON格式错误
  • 未使用jOOQ提供的JSON相关构造器,直接传入普通字符串导致类型绑定错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 13:46:08