如何用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
相关产品推荐
相关产品推荐

