2010-12-17 3 views
5

Я использую Morphia, картографию Pojo для MongoDB, и мне трудно найти задачу, которая на мой взгляд должна быть очень простой: получение объекта по id. Я могу найти все объекты в коллекции, но я не могу понять простую задачу запроса с использованием идентификатора, полученного из списка. Я действительно говорю об ObjectId. Если я попытаюсь сделать это в JSON, я вижуQuerying Morphia by Id

ответ

14

Этот вопрос кажется неполным.

Также кажется, что ответ на ваш вопрос находится на Morphia QuickStart page. Кажется, это так просто.

Datastore ds = morphia.createDatastore("testDB"); 
String hotelId = ...; // the ID of the hotel we want to load 
// and then map it to our Hotel object 
Hotel hotel = ds.get(Hotel.class, hotelId); 

Значит, вам обязательно понадобится более подробная информация.

+5

не забудьте добавить «@Id ObjectId идентификатор» для лица. Это облегчит вам жизнь. – caarlos0 2011-09-21 17:05:23

7
Datastore ds = morphia.createDatastore("testDB"); 
String hotelId = "516d41150364a6a6697136c0"; // the ID of the hotel we want to load 
ObjectId objectId = new ObjectId(hotelId); 
// and then map it to our Hotel object 
Hotel hotel = ds.get(Hotel.class, objectId); 
+0

Можете ли вы объяснить, почему ваш код работает или что он делает? Лучшие ответы объясняют это решение, а не только действующий код. – nathangiesbrecht 2013-04-16 16:48:33

+0

@nathangiesbrecht В предыдущем [ответе] (http://stackoverflow.com/a/4475711/1094584) неверно. Идентификатор MongoDB не является типом String. Тип идентификатора MongoDB - ObjectId (org.bson.types.ObjectId). – 2013-04-17 10:04:50

5

Если вы обретение идентификатора и идентификатор предоставляются пользователем (означает, что это может быть любым типом данных), вы не должны использовать решение, приведенное выше.

Как объяснены в documentation, ObjectId состоит из 12 байт, так что если вы передаете что-то еще new ObjectId(myValue), ваш код будет сгенерирован IllegalArgumentException.

Вот как я реализовал метод, чтобы найти по идентификатору:

public Model findById(String id) throws NotFoundException { 
    if (!ObjectId.isValid(id)) { 
     throw new NotFoundException(); 
    } 

    ObjectId oid = new ObjectId(id); 
    Model m = datastore().find(Model.class).field("_id").equal(oid).get(); 
    if (m == null) { 
     throw new NotFoundException(); 
    } 
    return m; 
}