我正在使用 MongoDB 的 Pojo 映射器 Morphia,发现一个本该非常简单的任务却比较困难:根据 ID 获取对象。我能够在集合中找到所有对象,但无法通过已获取的 ID 简单查询。实际上,我是指 ObjectId。如果我尝试将其渲染为 JSON,则会看到...
这个问题似乎不完整。
而且看起来你问题的答案在Morphia QuickStart页面上。答案似乎很简单,只需按照以下步骤操作即可。
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);
所以你肯定需要更多的细节。
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);
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;
}
之前的解释使用了已弃用的方法:datastore().find(Model.class).field("_id").equal(oid).get();
我在 Morphia 2.2.10 上的变体:
public Optional<Hotel> findById(final String id) {
if (!ObjectId.isValid(id)) {
throw new SomeException();
}
final Query<Hotel> query = datastore.find(Hotel.class)
.filter(eq("_id", new ObjectId(id)));
return Optional.ofNullable(query.first());
}