MongoRepository自定义@Query查询方法始终返回空列表如何解决?
问题原因
- 核心错误:
@Query注解硬编码了查询条件,未绑定方法入参。你写的value="{ 'builder_id' : 1}"是固定查询builder_id等于数值1的文档,和你传入的builderId列表完全无关,且你的数据中builder_id为字符串类型的ObjectId值,自然没有匹配结果。 - 逻辑错误:你需要匹配列表中的任意一个
builder_id,MongoDB需要使用$in操作符才能实现多值匹配,原查询没有使用该操作符。 - 额外配置问题:
@Query的fields属性中指定了slogan、address、numberOfHouses三个字段,但是你的Community实体类没有定义对应属性,这部分字段即使查询到也无法映射到实体,属于无效配置。 - 入参错误:你传入的第三个
builderId值602db8e7b05b804313f9ft67包含非十六进制字符t,不符合你定义的ID格式规则,也无法匹配到数据库中的合法ObjectId。
修复方案
方案1:使用Spring Data衍生查询(推荐)
直接删除@Query注解即可,Spring Data会根据方法名findAllByBuilderId和实体类的@Field配置,自动生成正确的$in查询语句,无需手动写查询规则:
public interface CommunityRepository extends MongoRepository<Community,String> { List<Community> findAllByBuilderId(List<String> builderId); }
方案2:修正自定义@Query配置
如果你需要限定返回的字段,就修改@Query的内容,正确绑定参数、使用$in操作符,同时移除不存在的返回字段:
public interface CommunityRepository extends MongoRepository<Community,String> { @Query(value="{ 'builder_id' : {$in: ?0} }", fields="{ 'name' : 1, 'description' : 1}") List<Community> findAllByBuilderId(List<String> builderId); }
如果业务确实需要返回slogan、address、numberOfHouses字段,需要先在Community实体类中添加对应的属性定义。
额外修正
检查并修正非法的builderId入参,将602db8e7b05b804313f9ft67替换为合法的24位十六进制ID值。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

