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
相关产品推荐
相关产品推荐

