如何使用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
相关产品推荐
相关产品推荐

