Spring Boot MongoDB Repository如何实现嵌套对象字段的findBy查询
Spring Data MongoDB 嵌套字段查询解决方案
核心原理
Spring Data MongoDB 查询嵌套字段时,需要按照实体类的嵌套属性层级明确指定字段路径,不会自动递归扫描所有嵌套类的同名字段。你之前直接写findByTruckId无法生效,是因为框架默认只会在根实体TruckModelDTO中查找truckId属性,找不到对应字段就会抛出异常或返回空结果。
你场景对应的属性嵌套层级如下:
- 根实体
TruckModelDTO→ 嵌套属性testDTO(TestDTO类型) TestDTO→ 嵌套属性truckDTO(TruckDTO类型)TruckDTO→ 目标查询字段truckId
解决方案1:按层级拼接方法名(衍生查询)
按照「上层属性名+下层属性名」的规则拼接方法名即可,为了避免属性命名歧义,也可以用下划线_分隔不同层级的属性:
// 方式1:驼峰拼接(无命名歧义时可用) List<TruckModelDTO> findByTestDTOTruckDTOTruckId(String truckId); // 方式2:下划线分隔(更清晰,避免属性名冲突) List<TruckModelDTO> findByTestDTO_TruckDTO_TruckId(String truckId);
解决方案2:使用@Query注解自定义查询(更简洁)
如果觉得方法名过长不好维护,可以直接用@Query注解指定MongoDB原生查询语句,方法名可以自定义:
@Query("{ 'testDTO.truckDTO.truckId' : ?0 }") List<TruckModelDTO> findByTruckId(String truckId);
这里的?0对应方法的第一个入参truckId,查询语句里的字段路径和MongoDB文档的嵌套结构完全一致。
内容的提问来源于stack exchange,提问作者Vikram Srinivasan
相关产品推荐
相关产品推荐

