很久之前也遇到过一样的问题,发现自己没📈什么记性,果然是好记性不如烂笔头,在此记录下,以免下次再次踩坑。 →。→
创建如下对象:
@Document(collection="Work")
@Data
class Work{
@Id
@JsonView(InspectionView.class)
private String id;
@JsonView(WorkTypeView.class)
private WorkType workType;
@JsonView(InspectionView.class)
private PersonSnapshot personSnapshot;
@Data
class PersonSnapshot{
@JsonView(InspectionView.class)
private String id;
@JsonView(InspectionView.class)
private String name;
}
}
在使用Criteria拼接查询语句中,criteria.and("personSnapshot.id").in(Person.getId());
执行后发现没有查到任何数据,一开始还以为是没有对应的数据,手动去Mongo确认了一下发现并不是这样。
想了很久没什么思路,通过Debug信息输出发现每次执行,personSnapshot.id -> personSnapshot._id
Spring提供的MongoTemplate中,对于属性的处理:
try {
Field field = createPropertyField(entity, key, mappingContext);
Entry<String, Object> entry = getMappedObjectForField(field, query.get(key));
result.put(entry.getKey(), entry.getValue());
} catch (InvalidPersistentPropertyPath invalidPathException) {
// in case the object has not already been mapped
if (!(query.get(key) instanceof DBObject)) {
throw invalidPathException;
}
result.put(key, query.get(key));
}
由于急于处理问题,所以没有跟踪的很仔细,但QueryMapper以及其内部类Field中发现存在
private static final List<String> DEFAULT_ID_NAMES = Arrays.asList("id", "_id");
private static final String ID_KEY = "_id";
由此猜测Spring会根据传入的对象映射其属性,对id属性进行默认加“_”操作。
所以尝试着在对象属性中加入@Field("id")注解:
@Data
class PersonSnapshot{
@Field("id")
@JsonView(InspectionView.class)
private String id;
@JsonView(InspectionView.class)
private String name;
}
结果是令人满意的, 终于找出了问题所在。
© 著作权归作者所有