如何用Java查询PostgreSQL jsonb列中指定键值的条目?
你用的jsonb_exists函数只负责检查jsonb列里是否存在某个键,不是用来匹配键值对的。你传入"665",它会去查external_ids里有没有叫"665"的键,自然找不到目标数据。
给你两种可行的解决方法:
方法1:用->>操作符直接匹配键值
->>会把jsonb中指定键的取值转为文本,直接和参数比较就行,SQL逻辑最直观:
@Query(nativeQuery = true, value = """ select * from _book_complex where external_ids ->> 'classifiedId' = ?1 """) Optional<BookComplexEntity> findByClassifiedId(String classifiedId);
调用的时候直接传"665"就行,和你原来的调用方式一致。
方法2:用@>包含操作符匹配jsonb对象
如果你想匹配完整的键值对结构,可以用@>操作符,它会检查external_ids是否包含传入的jsonb对象:
@Query(nativeQuery = true, value = """ select * from _book_complex where external_ids @> ?1::jsonb """) Optional<BookComplexEntity> findByClassifiedId(String classifiedJson);
调用时需要传入构造好的JSON字符串,比如"{\"classifiedId\": \"665\"}",或者用JSON工具类(比如Jackson)生成对应的JSON字符串,避免手动拼接出错。
如果你的classifiedId实际是数值类型(不是字符串),可以把->>换成->再转成数值类型比较,比如:
where (external_ids -> 'classifiedId')::int = ?1
内容的提问来源于stack exchange,提问作者NeverSleeps
相关产品推荐
相关产品推荐

