通过Id查询Morphia

msc*_*iab 5 java mongodb morphia

我正在使用Morphia,MongoDB的Pojo映射器,我觉得很难在我看来应该很简单的任务:通过id获取一个对象.我能够找到集合中的所有对象,但我无法弄清楚使用从列表中获取的id查询的简单任务.我其实在谈论ObjectId.如果我尝试用JSON渲染它,我会看到

Gat*_* VP 13

这个问题似乎不完整.

您似乎也可以在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);
Run Code Online (Sandbox Code Playgroud)

所以你肯定需要更多细节.

  • 永远不要忘记将"@Id ObjectId id"添加到实体.它让你的生活更轻松. (5认同)

Pav*_*l B 8

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);
Run Code Online (Sandbox Code Playgroud)


c4k*_*c4k 6

如果您通过id查找并且id由用户提供(意味着它可以是任何类型的数据),则不应使用上面给出的解决方案.

正如文档中所解释的,ObjectId 由12个字节组成,因此如果您传递其他内容new ObjectId(myValue),您的代码将抛出一个IllegalArgumentException.

以下是我通过id实现查找方法的方法:

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;
}
Run Code Online (Sandbox Code Playgroud)