春季数据 Mongo - 如何按@DBRef字段的 id 进行查询
2022-09-04 03:49:20
我是Spring Data Mongo的新手,所以我一定是做错了什么,因为我无法执行如此简单的查询。这是我的模型:
@Document(collection="brands")
public class Brand{
@Id
private int id;
private String name;
...
//getters-setters
}
@Document(collection="models")
public class Model{
@Id
private int id;
private String name;
@DBRef
private Brand brand;
...
//getters-setters
}
我想从一个品牌中获取所有模型,因此我按如下方式实现DAO:
@Repository
public interface IModelDAO extends MongoRepository<Model, Integer>{
@Query(value="{ 'brand.$id' : ?0 }")
public List<Model> findByBrandId(Integer id);
}
如果我在shell中执行这个mongodb查询,它会起作用:db.modelss.find({ 'brand.$id' : 1 })
但是,Java 应用程序会引发以下异常:
Caused by: java.lang.IllegalAccessError
at org.springframework.data.mapping.PropertyReferenceException.detectPotentialMatches(PropertyReferenceException.java:134)
显然,它正在寻找一个在Brand类中$id字段,并且由于它不存在,因此它失败了。因此,我将查询更改为以下内容,以便它导航到 id 字段:
@Query(value="{ 'brand.id' : ?0 }")
现在,它不会引发异常,但不会在数据库中找到任何内容。
调试 MongoTemplate.executeFindMultiInternal() 方法可以看到
DBCursor cursor = null;
try {
cursor = collectionCallback.doInCollection(getAndPrepareCollection(getDb(), collectionName));
游标的查询是 。所以它没有找到任何东西是有道理的。在调试期间将查询值更改为 query={ “brand.$id” : 134} 它有效。query={ "brand" : 134}
那么,为什么查询没有被正确翻译呢?