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

存在重复值时,如何编写Spring JPA Map查询语句?

修正Spring JPA查询方案

问题根源

原查询错误的核心是:用VALUE(event.metaProperties)会取出metaProperties中所有键对应的值(包括messageId、messageUUID等),结合key(event.metaProperties) = 'messageUUID'的写法,会将每个事件的metaProperties拆分为多行键值对数据,导致子查询返回多行结果,触发数据库报错。

正确的JPQL查询写法

直接通过Map键访问对应的值,无需拆分键值对,每个事件只会生成一条匹配记录:

@Query("select event.id from EventLogDb event where event.metaProperties['messageUUID'] = :message")
Slice<Long> findAllByMessage(String message, Pageable pageable);

关键修正点

  • 修正返回类型:原查询选择的是event.id,因此返回类型应为Slice<Long>(假设ID是Long类型),而非Slice<EventLogDb>,否则会出现类型不匹配异常。

原生SQL备选方案(以PostgreSQL为例)

如果JPQL的Map访问方式不生效,可使用PostgreSQL针对JSON/HStore类型的原生语法:

@Query(value = "select el.id from event_log_db el where el.meta_properties ->> 'messageUUID' = :message", nativeQuery = true)
Slice<Long> findAllByMessage(String message, Pageable pageable);

这里->>操作符用于从JSON/HStore类型的字段中提取指定键的字符串值,直接与传入参数比较即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:40:39