



Из документации:
Вы можете использовать Morphia для сопоставления запросов, которые вы, возможно, уже написали с использованием необработанного Java API, на свои объекты или для доступа к функциям, которых еще нет в Morphia.
Например:
DBObject query = BasicDBObjectBuilder.start()
.add("albums",
new BasicDBObject("$elemMatch",
new BasicDBObject("$and", new BasicDBObject[] {
new BasicDBObject("albumId", albumDto.getAlbumId()),
new BasicDBObject("album",
new BasicDBObject("$exists", false))})))
.get();
Artist result = datastore.createQuery(Artist.class, query).get();
Надеюсь, это тебе поможет.
Upd .:
В качестве альтернативы вы можете попробовать следующее:
DBCursor dbCursor = datastore.getCollection(MyClass.class).find(query);
while (dbCursor.hasNext()) {
DBObject obj = dbCursor.next();
MyClass class = morphia.fromDBObject(datastore, MyClass.class, obj);
// do stuff
}
Получение ошибки createQuery (Class <UserModel>) в Datastore нельзя применить к (Class <UserModel>, com.mongodb.DBObject)
Может быть, он доступен в последней версии или с некоторыми зависимостями. Хорошо .. Попробуйте использовать datastore.getCollection (MyClass.class) .find (query), где запрос - это DBObject.
Хорошо, тогда он возвращает объект DBCursor, так как же получить значение поиска из DBCursor?
Если вы используете Java 8 или выше: dbCursor.forEach(item -> {// do smth., ex: System.out.println(item.get('fieldName'))}); Альтернативно: while(dbCursor.hasNext()) {DBObject obj = dbCursor.next();}
Таким образом вы можете получить свой класс -> morphia.fromDBObject(datastore, MyClass.class, obj);
Первый ответ @ Marcus-rool - правильный подход. Вы может используете fromDBObject(), хотя не должны. Он доступен публично во многом из-за истории и ограничений в средствах управления доступом Java. Но следует отметить, что этот метод устарел в 1.5.0 (еще не выпущен) и будет удален / заменен в 2.0.0. Это действительно внутренний метод, который был представлен для $reasons, но никогда не предназначался для использования извне.
Другой вариант, если у вас уже есть запрос в формате необработанной строки, - использовать BasicDBObject.parse() для синтаксического анализа вашего запроса в DBObject, а затем построить Query, используя этот DBObject. Следует отметить, что если эта строка исходит из пользовательских данных, вам следует позаботиться о том, чтобы не выполнять произвольные запросы, которые могут извлекать данные, не авторизованные для пользователя, отправляющего этот запрос.
В Morphia v1.3.2 для доступа к методу createQuery, который получает аргумент DBObject, вам необходимо преобразовать хранилище данных в AdvancedDatastore.
Нравится:
Query<MyClass> myQuery = ((AdvancedDatastore) myDatastore).createQuery(MyClass.class, myDbObject);
Как использовать мой запрос в вашем примере?