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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:32:54