web-dev-qa-db-fra.com

Spring Data Mongo - Comment interroger par l'ID du champ @DBRef

Spring Data Mongo étant nouveau pour moi, je dois donc faire quelque chose de mal, car je ne parviens pas à exécuter une requête aussi simple. Ceci est mon modèle:

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

Je voudrais obtenir tous les modèles d'une marque, alors je mets en œuvre le DAO comme suit:

@Repository
public interface IModelDAO extends MongoRepository<Model, Integer>{
    @Query(value="{ 'brand.$id' : ?0 }")
    public List<Model> findByBrandId(Integer id);   
}

Si j'exécute cette requête mongodb dans le shell, cela fonctionne: db.modelss.find({ 'brand.$id' : 1 })

Mais l'application Java lève l'exception suivante:

Caused by: Java.lang.IllegalAccessError
at org.springframework.data.mapping.PropertyReferenceException.detectPotentialMatches(PropertyReferenceException.Java:134)

Apparemment, il recherche un champ $ id dans la classe Brand et comme il n'existe pas, il échoue. Je modifie donc la requête comme suit, de sorte qu'elle navigue dans le champ id:

@Query(value="{ 'brand.id' : ?0 }")

Maintenant, il ne lève pas d'exception mais ne trouve rien dans la base de données. 

Le débogage de la méthode MongoTemplate.executeFindMultiInternal () dans peut voir que dans

DBCursor cursor = null;
    try {
        cursor = collectionCallback.doInCollection(getAndPrepareCollection(getDb(), collectionName));

la requête du curseur est query={ "brand" : 134}. Il est donc logique de ne rien trouver. Changer la valeur de la requête pendant le débogage en query = {"brand. $ Id": 134} cela fonctionne.

Alors, pourquoi la requête n'est-elle pas correctement traduite?

8
codependent

Le problème était dû à @Id int type. Le changer en Integer l'a résolu:

@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

essaye ça;

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