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

