Spring Data MongoDB - Rückgabe nur ein Element aus einem verschachtelten Array mit @Query oder Mongotemplate und $ elemm
Posted: 24 Feb 2025, 03:10
Mein Modell besteht aus einer Sammlung von (CAR-) Modellen mit einer verschachtelten Sammlung von Kraftstofftypen ("Diesel", "Benzin", "Hybrid"). Jeder Kraftstoff verfügt über eine weitere verschachtelte Sammlung von Türen.
Code: Select all
{ _id : 'Ford Focus' , fuels : [ {_id : "Diesel" : "doors" : [2 , 3]} , {_id: "Gasoline" , doors : [2, 3, 4, 5] } ] }
< /code>
Wenn ich die für ein bestimmtes Modell und Kraftstofftyp verfügbaren Türen zur Verfügung stellen möchte, kann ich ausführen: < /p>
db.models.find( {"_id" : "Ford Focus" , "fuels._id" : "Diesel"} , { 'fuels' : {$elemMatch: {_id: "Diesel"} } })
< /code>
Wie kann ich das in eine @Query -Methode in einem Spring Data Repository übersetzen? < /p>
@Query(value="{ 'id' : ?0 , 'fuel' : ?1 }")
public Model findDoors(Integer model, String fuel);
< /code>
Die obige Implementierung gibt ein Dokument mit einem verschachtelten Array mit allen Arten von Kraftstoffen zurück, nicht nur der als Parameter übergebene. Wo kann ich die $ Elemmatch -Projektion in ein Spring Data Repository einfügen? Die Mongotemplate und die BasicQuery -Klasse folgen diesem Beitrag < /p>
public Model findDoors(Integer model, String fuel){
Criteria findModelCriteria = Criteria.where("id").is(model);
Criteria findFuelCriteria = Criteria.where("fuels").elemMatch(Criteria.where("id").is(fuel));
BasicQuery basicQuery = new BasicQuery(findModelCriteria.getCriteriaObject(), findFuelCriteria.getCriteriaObject());
return mongoTemplate.findOne(basicQuery, Model.class);
}
< /code>
In diesem Fall erhalte ich eine Ausnahme, wenn der Konstruktor von PropertyPath < /code> aufgerufen wird, da er versucht, auf ein Feld namens $ elemmatch in Model.class zuzugreifen (???) < /p>
Caused by: java.lang.IllegalAccessError
at org.springframework.data.mapping.PropertyReferenceException.detectPotentialMatches(PropertyReferenceException.java:134)
at org.springframework.data.mapping.PropertyReferenceException.(PropertyReferenceException.java:59)
at org.springframework.data.mapping.PropertyPath.(PropertyPath.java:75)