如何查询数据库JSONB类型字段?现有查询无结果求解决方案
解决方案:PostgreSQL JSONB数组查询包含指定键的记录
针对你的场景(foo表的foo_data字段是JSONB数组,每个元素为单个键值对对象),以下是两种可行的查询方法:
方法1:使用jsonb_path_exists路径查询
利用PostgreSQL的JSON路径查询功能,直接检查数组中是否存在包含指定键的元素:
@Query(value = "SELECT * FROM foo f WHERE jsonb_path_exists(f.foo_data, '$[*].:key', jsonb_build_object('key', :key))", nativeQuery = true) List<Foo> findFooByKey(@Param("key") String key);
说明:
$[*].:key表示遍历数组所有元素($[*]),检查是否存在名为:key的属性jsonb_build_object('key', :key)用于将参数绑定到JSON路径变量,避免SQL注入问题
方法2:展开数组后检查键
通过jsonb_array_elements展开JSONB数组,再用jsonb_object_keys提取每个对象的键进行匹配:
@Query(value = "SELECT DISTINCT f.* FROM foo f JOIN jsonb_array_elements(f.foo_data) arr ON true WHERE :key = ANY(jsonb_object_keys(arr))", nativeQuery = true) List<Foo> findFooByKey(@Param("key") String key);
说明:
jsonb_array_elements(f.foo_data)将数组拆分为单个JSON对象jsonb_object_keys(arr)获取每个对象的所有键:key = ANY(...)判断指定键是否存在于对象的键集合中DISTINCT确保原表记录不会因为数组多个匹配元素而重复返回
为什么之前的查询失败?
你之前使用的JSONB_EXISTS写法存在路径表达式错误:
@.key并非获取JSON对象键的正确语法,不符合PostgreSQL的JSON路径规则@-> == :key写法错误,@->是JSON提取运算符,不能直接用于键的匹配判断
内容的提问来源于stack exchange,提问作者esref
相关产品推荐
相关产品推荐

