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

如何用JOOQ编写WHERE子句过滤JSON数组内对象的指定属性

使用JOOQ 3.19.1构建PostgreSQL JSONB数组查询条件

针对你需要实现的SQL条件en.services->0->>'status' <> 'ACTIVE',在JOOQ 3.19.1中有两种简洁的实现方式:

方式一:使用JSONB专用函数

通过JOOQ提供的jsonbArrayElement和jsonbExtractPathText函数,直接对应PostgreSQL的JSONB操作符:

import static org.jooq.impl.DSL.*;

// 假设ENTITY是代码生成器生成的表类,SERVICES为JSONB类型字段
ctx.selectFrom(ENTITY)
   .where(ENTITY.OWNER_ID.eq("???")
       .and(jsonbExtractPathText(jsonbArrayElement(ENTITY.SERVICES, 0), "status").ne("ACTIVE")))
   .limit(1)
   .fetch();
  • jsonbArrayElement(ENTITY.SERVICES, 0) 对应SQL中的 services->0,取JSON数组的第一个元素
  • jsonbExtractPathText(..., "status") 对应SQL中的 ->>'status',提取指定属性的文本值

方式二:使用链式便捷方法

JOOQ的JSON字段支持链式调用get()方法,代码更直观:

ctx.selectFrom(ENTITY)
   .where(ENTITY.OWNER_ID.eq("???")
       .and(ENTITY.SERVICES.get(0).get("status").asText().ne("ACTIVE")))
   .limit(1)
   .fetch();
  • ENTITY.SERVICES.get(0) 访问JSON数组的第一个元素
  • .get("status") 获取元素中的status属性
  • .asText() 将属性值转换为文本类型,对应->>操作符

两种方式最终都会生成与你目标SQL完全一致的查询语句,只需确保代码生成器已正确将services字段映射为JOOQ的JSONB类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:42:07