Использование дженериков с Morphia & MongoDB - PullRequest
1 голос
/ 08 апреля 2020

Краткое описание:

У меня проблемы с чтением документа из базы данных mon go в класс java со свойством generi c. Ошибка говорит java.lang.Double cannot be cast to com.mongodb.DBObject

Длинное описание:

У меня есть java class / mongoDb-Collection с именем RandomDataCollection, который имеет свойства типа MyGenericProperty<T>

@Getter @Setter @NoArgsConstructor @Entity("randomDataCollection")
public class RandomDataCollection {

    @Id
    private ObjectId id = new ObjectId();

    private String name;

    @Embedded
    private MyGenericProperty<Float> temperatureMumbai;

}

MyGenericProperty<T> выглядит так

@Getter @Setter @NoArgsConstructor
public class MyGenericProperty<T> {

    private T value;

    private String unit;

}

Запись в БД работает как положено ...

MyGenericProperty<Float> temperatureMumbai = new MyGenericProperty<Float>();
temperatureMumbai.setValue(32.8f);
temperatureMumbai.setUnit("°C");

RandomDataCollection randomData = new RandomDataCollection();
randomData.setName("RandomData0711");
randomData.setTemperatureMumbai(temperatureMumbai);

Datastore datastore = getDatastore();
datastore.save(randomData);

... но когда я пытаюсь читать из БД ...

randomData = datastore.find(RandomDataCollection.class).filter("name =", "RandomData0711").get();

... Я получаю следующее исключение:

Caused by: java.lang.ClassCastException: java.lang.Double cannot be cast to com.mongodb.DBObject

Я нашел некоторые обсуждения дженериков и морфий, но, честно говоря, я не сделал не знаю, как применить это к моей проблеме.

Я использую Morphia 1.5.8

1 Ответ

1 голос
/ 11 апреля 2020

Почти наверняка есть лучший способ сделать это, но у меня это сработало.

DBCursor cursor = datastore.find(RandomDataCollection.class).filter("name =", name).fetch().getCursor();
List<RandomDataCollection> list = new ArrayList<>();
while (cursor.hasNext()) {
    DBObject theObj = cursor.next();
    RandomDataCollection rec = new RandomDataCollection();
    rec.setId((ObjectId)theObj.get("_id"));
    MyGenericProperty<Float> temperatureMumbai = new MyGenericProperty<Float>();
    BasicDBObject x = (BasicDBObject)theObj.get("temperatureMumbai");
    temperatureMumbai.setValue(x.getFloat("value"));
    temperatureMumbai.setUnit(x.getString("unit"));
    rec.setTemperatureMumbai(temperatureMumbai);
    list.add(rec);
}
...