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?
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
}
essaye ça;
Query que = new Query();
que.addCriteria(Criteria.where("user.$id").is(new ObjectId("123456789012345678901234")));