私はSpringData 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);
}
_
シェルでこのmongodbクエリを実行すると、次のように機能します。db.modelss.find({ 'brand.$id' : 1 })
ただし、Javaアプリケーションは次の例外をスローします。
_Caused by: Java.lang.IllegalAccessError
at org.springframework.data.mapping.PropertyReferenceException.detectPotentialMatches(PropertyReferenceException.Java:134)
_
どうやらそれはブランドクラスでフィールド$ idを探しています、そしてそれが存在しないのでそれは失敗します。そこで、クエリを次のように変更して、idフィールドに移動します。
_@Query(value="{ 'brand.id' : ?0 }")
_
現在、例外はスローされませんが、DBには何も見つかりません。
でMongoTemplate.executeFindMultiInternal()メソッドをデバッグすると、
_DBCursor cursor = null;
try {
cursor = collectionCallback.doInCollection(getAndPrepareCollection(getDb(), collectionName));
_
カーソルのクエリは_query={ "brand" : 134}
_です。したがって、何も見つからないのは理にかなっています。デバッグ中にクエリ値をquery = {"brand。$ id":134}に変更すると機能します。
では、なぜクエリが正しく翻訳されないのですか?
問題の原因は@Id
intタイプ。それを整数に変更すると解決しました:
@Document(collection="brands")
public class Brand{
@Id
private Integer id;
private String name;
...
//getters-setters
}
@Document(collection="models")
public class Model{
@Id
private Integer id;
private String name;
@DBRef
private Brand brand;
...
//getters-setters
}
これを試して;
Query que = new Query();
que.addCriteria(Criteria.where("user.$id").is(new ObjectId("123456789012345678901234")));