Spring Boot整合MongoDB查询单条记录返回null问题排查
问题根因排查
- 泛型主键类型不匹配:你的
PatientRepository继承MongoRepository时指定的第二个泛型(主键类型)为Long,但自定义的findById入参、Controller接收的路径参数类型都是String,类型不一致导致查询条件无法匹配到数据,最终返回空。 - 冗余自定义查询方法:
MongoRepository本身已经内置了findById方法,你额外定义的同方法名、不同参数类型的查询方法会覆盖原有逻辑,同时和泛型指定的主键类型冲突。 - 补充验证点:确认你的
Patients实体类主键字段添加了@Id注解,且字段类型和MongoRepository指定的主键泛型类型一致;如果使用Mongo默认的_id(ObjectId类型),主键类型不能设置为Long。
修复方案
方案1:使用Mongo默认ObjectId作为主键(推荐)
- 修正Repository的泛型定义,删除冗余的自定义findById方法:
@Repository public interface PatientRepository extends MongoRepository<Patients, String> { }
- 确认
Patients实体类主键配置:
import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; @Document public class Patients { @Id private String id; // 和Repository泛型主键类型保持一致,对应Mongo的_id字段 // 其他字段、getter/setter }
- Controller代码无需修改,直接调用内置的findById方法即可。
方案2:如果确实使用Long类型作为主键
- 先在Controller层将字符串类型的id转为Long:
@GetMapping("/patient/{id}") public Optional<Patients> findTicketById(@PathVariable("id") @NotNull String id){ System.out.println(id); return patientRepository.findById(Long.valueOf(id)); }
- 修正Repository定义,删除自定义的findById方法:
@Repository public interface PatientRepository extends MongoRepository<Patients, Long> { }
- 确认
Patients实体类主键为Long类型,且添加了@Id注解。
验证修复效果前,可先直接在Mongo数据库执行查询语句
db.patients.find({"_id": 你传入的id值}),确认对应id的文档确实存在。
内容的提问来源于stack exchange,提问作者Malsha Madushani Kalahewaththa
相关产品推荐
相关产品推荐

