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

如何使用JPQL在JSON哈希映射中按键或值进行查询

JPQL查询JSON映射字段的解决办法

1. 正确适配Blaze-Persistence的JSON函数

你用的JSON_GET不被识别,大概率是没正确配置Blaze-Persistence的扩展,或者语法不对。先确认项目里引入了blaze-persistence-integration-spring-data-jpa依赖,然后把查询改成Blaze-Persistence支持的语法,同时注意JSON路径的标准写法:

@EntityGraph(value = "record")
@BlazeQuery("SELECT r FROM Records r WHERE JSON_VALUE(r.data, '$.123') = :value")
List<Record> findAllByViewAndColumn(String value);

Blaze-Persistence会自动根据你的数据库(比如MySQL、PostgreSQL)转换为对应的原生JSON函数,不用自己写数据库特定语法。

2. 直接用原生SQL查询(最稳妥)

如果Blaze-Persistence的扩展配置麻烦,直接写原生SQL更省心,对应你用的数据库调整JSON函数即可:

  • 若使用MySQL:
@EntityGraph(value = "record")
@Query(value = "SELECT * FROM records r WHERE JSON_VALUE(r.data, '$.123') = :value", nativeQuery = true)
List<Record> findAllByViewAndColumn(String value);
  • 若使用PostgreSQL:
@EntityGraph(value = "record")
@Query(value = "SELECT * FROM records r WHERE r.data ->> '123' = :value", nativeQuery = true)
List<Record> findAllByViewAndColumn(String value);

3. 给JPQL注册自定义JSON函数

要是不想用原生查询,也可以在JPA里把数据库的JSON函数注册成JPQL能识别的自定义函数。以Spring Boot + Hibernate为例,在application.properties里加配置(MySQL为例):

spring.jpa.properties.hibernate.query.function.json_value=org.hibernate.query.sqm.function.StandardJdbcFunction
spring.jpa.properties.hibernate.query.function.json_value.return_type=STRING

之后就能在JPQL里直接用json_value(r.data, '$.123')来查询了。

另外要确认实体里的data字段映射正确,比如用@Column(columnDefinition = "JSON")或者对应JPA实现的JSON类型注解,不然数据库层面也没法正确解析JSON内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 04:45:29