如何在jOOQ中为PostgreSQL的JSONB类型字段设置查询条件
PostgreSQL JSONB字段查询转jOOQ实现方法
以下是你给出的原生SQL对应的两种常用jOOQ写法,最终生成的执行逻辑和原SQL完全一致:
写法1:使用代码生成器生成的表元类(推荐)
适用于已经通过jOOQ代码生成工具生成了notifications表对应元类的场景,写法最简洁:
import static org.jooq.impl.DSL.*; // 替换为你自己项目中jOOQ生成的表类包路径 import static com.yourproject.generated.Tables.NOTIFICATIONS; // 核心查询逻辑 dslContext.selectFrom(NOTIFICATIONS) .where(NOTIFICATIONS.REFERENCE_OBJECT.jsonGetText("questionId") .eq("0e75ce19-d124-4d86-84e8-10362c38c972")) .fetch();
说明:
jsonGetText是jOOQ 3.14+版本针对JSON/JSONB类型提供的原生方法,直接对应PostgreSQL的->>运算符,会将JSON指定键的值以字符串类型返回。
写法2:手动构造字段(无代码生成场景)
如果没有使用代码生成器,手动构造表和字段也可以实现相同逻辑,同时兼容所有jOOQ版本:
import static org.jooq.impl.DSL.*; // 手动构造reference_object字段和notifications表对象 Field<Object> referenceObject = field(name("public", "notifications", "reference_object")); dslContext.selectFrom(table(name("public", "notifications"))) .where(field("{0} ->> {1}", String.class, referenceObject, val("questionId")) .eq("0e75ce19-d124-4d86-84e8-10362c38c972")) .fetch();
内容的提问来源于stack exchange,提问作者Arvind Kumar
相关产品推荐
相关产品推荐

