Могу ли я использовать необработанный запрос с Morphia?

У меня такой запрос:

{ query: { "$where" : { this.userName == 'Jack123' } }  }

Примечание:-Пожалуйста, не предлагайте query.where()

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
831
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Из документации:

Вы можете использовать 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
}

Как использовать мой запрос в вашем примере?

Victory 11.12.2018 13:52

Получение ошибки createQuery (Class <UserModel>) в Datastore нельзя применить к (Class <UserModel>, com.mongodb.DBObject)

Victory 11.12.2018 14:08

Может быть, он доступен в последней версии или с некоторыми зависимостями. Хорошо .. Попробуйте использовать datastore.getCollection (MyClass.class) .find (query), где запрос - это DBObject.

Margulan Zharkenov 11.12.2018 14:41

Хорошо, тогда он возвращает объект DBCursor, так как же получить значение поиска из DBCursor?

Victory 11.12.2018 14:54

Если вы используете Java 8 или выше: dbCursor.forEach(item -> {// do smth., ex: System.out.println(item.get('fieldName'))}); Альтернативно: while(dbCursor.hasNext()) {DBObject obj = dbCursor.next();}

Margulan Zharkenov 11.12.2018 15:05

Таким образом вы можете получить свой класс -> morphia.fromDBObject(datastore, MyClass.class, obj);

Margulan Zharkenov 11.12.2018 15:11

Первый ответ @ 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);

Другие вопросы по теме