2015-05-19 2 views
1

Я использую Morphia и DAO Class. У меня есть класс с Id ObjectId:Java MongoDB Morphia: найти объект ObjectId id

@Entity 
@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class GeoProfileVo extends ResponseVo implements Serializable{ 

    private static final long serialVersionUID = -4975628041316056892L; 

    @Id private ObjectId id; 

    private String email; 
    private String name; 
    private String city; 

    //Getters, Setters and toString 
} 

GeoProfileDAO:

public class GeoProfileDAO extends BasicDAO<GeoProfileVo, ObjectId>{ 

    public GeoProfileDAO(Morphia morphia, MongoClient mongoClient, String db) { 
     super(mongoClient, morphia, db); 
    } 

    public GeoProfileVo findByNme(String name){ 
     return getDs().find(GeoProfileVo.class, "name", name).get(); 
    } 

    //Here is the problem 
    public GeoProfileVo findById (ObjectId id){ 
     //return getDs().find(GeoProfileVo.class).field("id").equal(id).get(); 
     return getDs().get(GeoProfileVo.class, id); 
    } 

    public ObjectId saveGeoProfile(GeoProfileVo geoProfileVo){ 
     return (ObjectId) getDs().save(geoProfileVo).getId(); 
    } 
} 

Моя_служба:

public class GeolocationService implements Serializable{ 

    private static final long serialVersionUID = 2071937170723089158L; 

    /** The Constant log. */ 
    private static final Logger LOGGER = Logger.getLogger(GeolocationService.class.getName()); 

    private MongoClient mongoClient; 
    private GeoProfileDAO geoProfileDAO; 

    public GeolocationService(){ 
     super(); 
     LOGGER.info("[GeolocationService - Constructor] - init"); 

     //mongoClient: 
     mongoClient = new MongoClient("localhost",27017); 

     //morphia: 
     Morphia morphia = new Morphia(); 
     morphia.map(GeoProfileVo.class); 

     //morphia dao: 
     geoProfileDAO = new GeoProfileDAO(morphia, mongoClient, "mydb"); 
    } 

    public GeoProfileVo updateGeoProfile(GeoProfileVo geoProfileVo) throws GeoProfileNotFoundException{ 
     LOGGER.info("[GeolocationService - updateGeoProfile] - init"); 
     long currentSystemTime=System.currentTimeMillis(); 

     if(geoProfileVo == null){ 
      LOGGER.error("[GeolocationService - updateGeoProfile] - geoProfileVo cannot be null"); 
      throw new IllegalArgumentException(); 
     } 
     if(geoProfileVo.getId() == null){ 
      LOGGER.error("[GeolocationService - updateGeoProfile] - ID cannot be null"); 
      throw new IllegalArgumentException(); 
     } 

     GeoProfileVo geoProfileVoEntity = geoProfileDAO.findById(geoProfileVo.getId()); 
     if(geoProfileVoEntity==null){ 
      LOGGER.error("[GeolocationService - updateGeoProfile] - geoProfileVo not found in BD"); 
      throw new GeoProfileNotFoundException(); 
     } 

     LOGGER.debug("[GeolocationService - updateGeoProfile] - Finish Timing:"+(System.currentTimeMillis()-currentSystemTime)); 
     return geoProfileDAO.updateGeoProfile(geoProfileVo); 
    } 

    //CRUD 

} 

Я могу искать по электронной почте, имя или город, вставить объект в BD, но я не могу выполнить поиск по id. В google я только нахожу информацию о идентификаторе String, и я не нахожу много информации об идентификаторе типа ObjectId. когда я пытаюсь найти идентификатор ObjectId, он ничего не находит и возвращает null.

Например, когда я найти по электронной почте, возвращается:

{ 
     "id": { 
      "timestamp": 1432028968, 
      "machineIdentifier": 9913253, 
      "processIdentifier": 7516, 
      "counter": 8215016 
     }, 
     "email": "[email protected]", 
     "name": "john", 
     "city": "Madrid" 
} 

я называю WS, который называют в createGeoProfile службу с тем же объект с тем же идентификатором, но в Eclipse IDE, «ID» отличается в каждом вызове. Может быть, проблема здесь, но я этого не понимаю.

Как найти объект с идентификатором типа ObjectId?

+0

Вы можете использовать 'ObjectId ObjectId = новый ObjectId ("ВАШ ID");' или Stringid = «ВАШ ID "и" return getDs(). get (GeoProfileVo.class, stringId); ' –

+0

Извините, но я не знаю, где находится« ВАШ ИД »или найти его. Я видел это сообщение, но это 4 года назад, и это не знак как разрешенный. – josekron

+0

Не похоже, что ваши объекты сохраняются должным образом. Не должно быть поля под названием «geoProfileVo» в сохраненном документе Morphia. И ObjectId также не сохраняется должным образом. Он должен быть ObjectId в bson в оболочке. Что-то определенно неправильно здесь, но это не похоже на то, что Морфия находится в центре этого. – evanchooly

ответ

2

Решение было возвращено ObjectId.toString(), когда я вставляю объект в BD. Я понимаю, что этот objectId похож на Hash, поэтому, когда я хочу найти Id, я не могу отправить тип ObjectId, потому что этот ObjectId изменяется. По этой причине мы должны вернуть toString() (эта часть заключалась в том, что я не расстался).

С помощью этой строки мы экземпляр ObjectId, что мы используем его для поиска с помощью ID:

public GeoProfileVo findById (String id){ 
    ObjectId oid = new ObjectId(id); 
    return getDs().find(GeoProfileVo.class).field("id").equal(oid).get(); 
} 

public String saveGeoProfile(GeoProfileVo geoProfileVo){ 
    return getDs().save(geoProfileVo).getId().toString(); 
} 

В конце концов, чтобы избежать типа ObjectId, что я не буду использовать его, изменить идентификатор my GeoProfileVo для ввода String.

@Id private String id; 

Теперь ответ FindById, содержит идентификатор в строковый тип:

{ 
    "id": "555c44e39743a5141c00d0a1", 
    "email": "[email protected]", 
    "name": "john", 
    "city": "Madrid" 
} 
+0

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

Смежные вопросы