存在重复值时,如何编写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
相关产品推荐
相关产品推荐

