我的模型由一系列(汽车)模型组成,这些模型具有可用的燃料类型的嵌套集合(“柴油”,“汽油”,“混合”)。每种燃料都有另一套嵌套的门。
例如:
{ _id : 'Ford Focus' , fuels : [ {_id : "Diesel" : "doors" : [2 , 3]} , {_id: "Gasoline" , doors : [2, 3, 4, 5] } ] }
如果我想为某种型号和燃料类型提供可用的门,我可以执行:
db.models.find( {"_id" : "Ford Focus" , "fuels._id" : "Diesel"} , { 'fuels' : {$elemMatch: {_id: "Diesel"} } })
如何将其转换为Spring Data Repository中的@Query方法?
@Query(value="{ 'id' : ?0 , 'fuel' : ?1 }")
public Model findDoors(Integer model, String fuel);
上面的实现,返回一个包含所有类型燃料的嵌套数组的文档,而不仅仅是作为参数传递的那个。我在哪里可以将$ elemMatch投影放在Spring Data Repository中?
更新:经过一番研究后,我尝试使用自定义存储库,MongoTemplate和BasicQuery类来完成它,遵循此post
public Model findDoors(Integer model, String fuel){
Criteria findModelCriteria = Criteria.where("id").is(model);
Criteria findFuelCriteria = Criteria.where("fuels").elemMatch(Criteria.where("id").is(fuel));
BasicQuery basicQuery = new BasicQuery(findModelCriteria.getCriteriaObject(), findFuelCriteria.getCriteriaObject());
return mongoTemplate.findOne(basicQuery, Model.class);
}
在这种情况下,当调用PropertyPath
的构造函数时,我得到一个异常,因为它试图访问Model.class中的一个名为$ elemMatch的字段(???)
Caused by: java.lang.IllegalAccessError
at org.springframework.data.mapping.PropertyReferenceException.detectPotentialMatches(PropertyReferenceException.java:134)
at org.springframework.data.mapping.PropertyReferenceException.<init>(PropertyReferenceException.java:59)
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:75)