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

Spring Boot整合MongoDB查询单条记录返回null问题排查

问题根因排查

  • 泛型主键类型不匹配:你的PatientRepository继承MongoRepository时指定的第二个泛型(主键类型)为Long,但自定义的findById入参、Controller接收的路径参数类型都是String,类型不一致导致查询条件无法匹配到数据,最终返回空。
  • 冗余自定义查询方法:MongoRepository本身已经内置了findById方法,你额外定义的同方法名、不同参数类型的查询方法会覆盖原有逻辑,同时和泛型指定的主键类型冲突。
  • 补充验证点:确认你的Patients实体类主键字段添加了@Id注解,且字段类型和MongoRepository指定的主键泛型类型一致;如果使用Mongo默认的_id(ObjectId类型),主键类型不能设置为Long。

修复方案

方案1:使用Mongo默认ObjectId作为主键(推荐)

  1. 修正Repository的泛型定义,删除冗余的自定义findById方法:
@Repository
public interface PatientRepository extends MongoRepository<Patients, String> {

}
  1. 确认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
}
  1. Controller代码无需修改,直接调用内置的findById方法即可。

方案2:如果确实使用Long类型作为主键

  1. 先在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));
}
  1. 修正Repository定义,删除自定义的findById方法:
@Repository
public interface PatientRepository extends MongoRepository<Patients, Long> {

}
  1. 确认Patients实体类主键为Long类型,且添加了@Id注解。

验证修复效果前,可先直接在Mongo数据库执行查询语句db.patients.find({"_id": 你传入的id值}),确认对应id的文档确实存在。

内容的提问来源于stack exchange,提问作者Malsha Madushani Kalahewaththa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 10:18:01