Использование spring-data-mongodb-1.5.4
и mongodb-driver-3.4.2
У меня классный Hotel
public class Hotel {
private String name;
private int pricePerNight;
private Address address;
private List<Review> reviews;
//getter, setter, default constructor, parameterized constructor
Класс Review
:
public class Review {
private int rating;
private String description;
private User user;
private boolean isApproved;
//getter, setter, default constructor, parameterized constructor
Когда я звоню в Aggregation.unwind("reviews");
он бросает
org.springframework.data.mapping.model.MappingInstantiationException: не удалось создать экземпляр java.util.List с использованием конструктора NO_CONSTRUCTOR с аргументами
UnwindOperation unwindOperation = Aggregation.unwind("reviews");
Aggregation aggregation = Aggregation.newAggregation(unwindOperation);
AggregationResults<Hotel> results=mongoOperations.aggregate(aggregation,"hotel", Hotel.class);
Я вижу этот вопрос, но не помогает.
Как это решить?
Когда вы $unwind
reviews
, запрос return json structure больше не соответствует вашему классу Hotel
. Поскольку операция $unwind
делает reviews
под-объектом вместо списка. Если вы попробуете свой запрос в robomongo или некоторых других инструментах, вы можете увидеть, что ваш возвращаемый объект подобен этому
{
"_id" : ObjectId("59b519d72f9e340bcc830cb3"),
"id" : "59b23c39c70ff63135f76b14",
"name" : "Signature",
"reviews" : {
"id" : 1,
"userName" : "Salman",
"rating" : 8,
"approved" : true
}
}
Таким образом, вы должны использовать другой класс вместо Hotel
например, UnwindedHotel
public class UnwindedHotel {
private String name;
private int pricePerNight;
private Address address;
private Review reviews;
}
UnwindOperation unwindOperation = Aggregation.unwind("reviews");
Aggregation aggregation = Aggregation.newAggregation(unwindOperation);
AggregationResults<UnwindedHotel> results=mongoOperations.aggregate(aggregation,"hotel", UnwindedHotel.class);
Document.class
илиDBObject.class
для агрегированного вывода. Агрегации изменяют форму вывода, определяя, что они должны делать. Как правило, вам просто не нужен строгий тип для вывода, если вам действительно не нужна некоторая настраиваемая сериализация. Для всего остального, просто используйте дженерики. Вот для чего они здесь.