MongoDB Repository中@Query查询int32字段无结果问题求解
问题分析
MongoDB是强类型数据库,你存储的sem.id是NumberInt(72)(int32类型),而Java中int/Long参数与该类型存在隐式不匹配,导致查询无结果但不报错。以下是保留int32类型的解决方法:
解决步骤
1. 对齐实体类字段类型
检查Score实体类中嵌套的sem对象,将id字段定义为Integer(而非Long),确保与MongoDB的int32类型映射一致:
public class Sem { private Integer id; // 对应MongoDB的NumberInt类型 private String sem_number; // 省略getter、setter } public class Score { private String id; private Sem sem; private List<TestResult> testResults; private Double score; // 省略getter、setter }
2. 调整Repository方法参数类型
将findBySemId的参数从int改为Integer,避免基本类型装箱带来的类型映射偏差:
@Repository public interface ScoreRepository extends MongoRepository<Score, String> { @Query(value = "{ 'sem.id' : ?0 }") List<Score> findBySemId(final Integer semId); }
3. 强制类型匹配(可选)
如果上述方法仍无效,可在@Query中使用MongoDB的$type操作符,明确指定匹配int32类型(BSON类型代码为3):
@Query(value = "{ 'sem.id' : { $eq: ?0, $type: 3 } }") List<Score> findBySemId(final Integer semId);
4. 规范方法调用
调用查询方法时,传入Integer类型参数,避免传入Long或其他类型:
List<Score> scores = scoreRepository.findBySemId(72);
内容的提问来源于stack exchange,提问作者Johns Babu
相关产品推荐
相关产品推荐

