web-dev-qa-db-ja.com

Spring DataMongo- @ DBRefフィールドのIDでクエリを実行する方法

私は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}に変更すると機能します。

では、なぜクエリが正しく翻訳されないのですか?

9
codependent

問題の原因は@Idintタイプ。それを整数に変更すると解決しました:

@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
}
5
codependent

これを試して;

Query que = new Query();
que.addCriteria(Criteria.where("user.$id").is(new ObjectId("123456789012345678901234")));