MongoDB Repository返回整数报MappingException问题求助
问题解决:Spring Data MongoDB查询_id映射Integer报错
错误原因
Spring Data MongoDB执行你的查询时,返回的是包含_id字段的Mongo Document对象,框架无法直接将该Document映射到Integer类型(因为找不到对应Integer的持久化实体定义),因此抛出MappingException异常。
解决方案
方法一:使用框架自带的existsById方法(最推荐)
你的核心需求是检查记录是否存在,完全不需要返回_id的值,直接用MongoRepository继承的existsById方法即可,代码简洁且避免映射问题:
修改业务代码:
public boolean checkForDuplicateRecords(Integer id, CovidCases cases){ boolean exists = casesRepository.existsById(id); if (exists){ log.info("existingid is {} and casesid is {}", id, cases.getId()); return true; } return false; }
Repository无需额外定义方法,MongoRepository<CovidCases, Integer>已自带existsById(Integer id)方法。
方法二:修改Repository方法返回Optional(需获取_id值时用)
如果确实需要获取_id的整数值,可将Repository方法的返回类型改为Optional<Integer>,让框架自动提取Document中的_id字段:
修改Repository:
@Repository public interface CasesRepository extends MongoRepository<CovidCases, Integer> { @Query(value = "{ '_id' : ?0 }", fields = "{ '_id' : 1}") Optional<Integer> findIdById(Integer id); }
调整业务代码:
public boolean checkForDuplicateRecords(Integer id, CovidCases cases){ Optional<Integer> existingIdOpt = casesRepository.findIdById(id); if (existingIdOpt.isPresent()){ Integer existingId = existingIdOpt.get(); log.info("existingid is {} and casesid is {}", existingId, cases.getId()); return true; } return false; }
用Optional处理记录不存在的情况,避免空指针异常。
方法三:使用投影接口(规范的字段投影方式)
定义仅包含_id的投影接口,通过Spring Data的投影机制提取字段:
- 定义投影接口:
interface IdProjection { Integer getId(); }
- 修改Repository:
@Repository public interface CasesRepository extends MongoRepository<CovidCases, Integer> { @Query(value = "{ '_id' : ?0 }", fields = "{ '_id' : 1}") Optional<IdProjection> findProjectionById(Integer id); }
- 调整业务代码:
public boolean checkForDuplicateRecords(Integer id, CovidCases cases){ Optional<IdProjection> projectionOpt = casesRepository.findProjectionById(id); if (projectionOpt.isPresent()){ Integer existingId = projectionOpt.get().getId(); log.info("existingid is {} and casesid is {}", existingId, cases.getId()); return true; } return false; }
这种方式适合需要提取多个字段的场景,符合Spring Data的设计规范。
内容的提问来源于stack exchange,提问作者T.Huss
相关产品推荐
相关产品推荐

