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

Spring Data JPA 2.7.1原生查询中检查JSONB数组元素存在性

解决方案

针对你的需求,在Spring Data JPA 2.7.1的原生查询中避开混合参数占位符的问题,有以下几种可行写法:

方法1:展开数组元素匹配

通过jsonb_array_elements_text将ids数组展开为行,再匹配目标值,完全避免操作符与参数占位符的冲突:

SELECT * FROM test
WHERE EXISTS (
    SELECT 1 FROM jsonb_array_elements_text(rules -> 'ids') AS elem
    WHERE elem = ?
)

Java代码中直接传入字符串类型的目标值(如"123")即可,JPA会正常解析?为位置参数。

方法2:使用@>包含操作符

构造包含目标值的JSON数组作为参数,通过@>操作符判断原数组是否包含该值:

SELECT * FROM test
WHERE rules -> 'ids' @> ?::jsonb

Java代码中需将目标值包装为JSON数组格式(如["123"]),可借助Jsonb或其他JSON工具类,把List.of("123")转换为JSON字符串后传入参数。

方法3:使用jsonb_contains函数

这是@>操作符的函数形式,逻辑与方法2一致:

SELECT * FROM test
WHERE jsonb_contains(rules -> 'ids', ?::jsonb)

参数传入规则同方法2,需为包含目标值的JSON数组。

关于jsonb_exists_any的说明

你之前尝试的jsonb_exists_any需要两个JSON数组参数,正确写法应为:

SELECT * FROM test
WHERE jsonb_exists_any(rules -> 'ids', ?::jsonb)

同样需要传入包含目标值的JSON数组(如["123"]),若之前未成功,大概率是参数格式不正确导致的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:13:15