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

Spring Data @Query注解执行MongoDB $in查询返回空结果问题排查及用法咨询

问题分析与修复方案

我看到你的代码里有两个关键问题导致查询返回空结果,咱们一个个拆解来看:

1. @Query语句的JSON语法错误

你的查询字符串最后少了一个闭合的大括号},MongoDB的查询文档必须是完整的合法JSON结构。原代码里的@Query("{'employerId' : ?0, 'state' : { $in: ?1 } ")结尾只闭合了$in的数组,却没闭合外层的查询文档,这会导致Spring Data无法正确解析查询条件,自然匹配不到任何数据。

2. 参数索引完全不匹配

方法参数的顺序是Pageable pageable, String employerId, List<String> states,但Spring Data中?0对应的是第一个参数也就是Pageable对象——而分页参数是不需要放到查询条件里的,它是Spring Data单独用来处理分页逻辑的。你想用?0匹配employerId,但实际上employerId是第二个参数,对应索引?1,states是第三个参数,对应索引?2。

修复后的代码

下面是修正后的两种写法:

方式一:使用参数索引(注意索引对应关系)

@Query("{'employerId' : ?1, 'state' : { $in: ?2 }}")
Page<T> findByEmployerIdAndStates(Pageable pageable, String employerId, final List<String> states);

方式二:使用命名参数(更清晰,避免索引混乱)

推荐用这种方式,尤其是参数较多时,可读性更强:

import org.springframework.data.repository.query.Param;

// ...

@Query("{'employerId' : :employerId, 'state' : { $in: :states }}")
Page<T> findByEmployerIdAndStates(Pageable pageable, @Param("employerId") String employerId, @Param("states") final List<String> states);

额外检查点

如果修复后还是返回空,你可以再排查这几点:

  • 确认实体类的字段名和MongoDB集合中的字段完全一致:比如如果你的Spring Data配置了自动驼峰转下划线(默认是开启的),那数据库里的字段应该是employer_id,而不是employerId,这时候查询条件里也要对应改成employer_id。
  • 检查数据类型匹配:比如employerId在数据库里是字符串类型,你传入的是不是正确的字符串格式(比如有没有多写/少写字符)。
  • 注意MongoDB的大小写敏感性:如果数据库里的state值是ABC,而你传入的是abc,会因为大小写不匹配而查不到数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 09:14:06