2010-12-17 6 views
5

J'utilise Morphia, le mappeur Pojo pour MongoDB, et je trouve difficile une tâche qui, à mon avis, devrait être très simple: obtenir un objet par id. Je suis capable de trouver tous les objets d'une collection, mais je n'arrive pas à comprendre la simple tâche d'interroger en utilisant un identifiant de la liste. Je parle en fait de l'ObjectId. Si j'essaie de le rendre en JSON, je voisInterroger Morphia par Id

Répondre

14

Cette question semble être tronquée.

Il semble également que la réponse à votre question est sur le Morphia QuickStart page. Semble être aussi simple que suit.

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); 

Vous aurez certainement besoin de plus de détails.

+5

ne jamais oublier d'ajouter « @Id ObjectId id » à l'entité. Cela vous rend la vie plus facile. – caarlos0

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

Pouvez-vous expliquer pourquoi votre code fonctionne ou ce qu'il fait? Les meilleures réponses expliquent la solution, plutôt que de simplement faire fonctionner le code. – nathangiesbrecht

+0

@nathangiesbrecht Dans la réponse précédente (http://stackoverflow.com/a/4475711/1094584) est incorrecte. MongoDB Id n'est pas le type String. Type d'ID MongoDB est ObjectId (org.bson.types.ObjectId). –

5

Si vous trouvez par identifiant et l'identifiant est fourni par l'utilisateur (signifie qu'il pourrait être tout type de données), vous ne devriez pas utiliser les solutions données ci-dessus.

Comme cela est expliqué dans le documentation, un ObjectId se compose de 12 octets, donc si vous passez quelque chose à new ObjectId(myValue), votre code va jeter un IllegalArgumentException.

Voici comment je mis en œuvre la méthode pour trouver par 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; 
} 
+0

Si l'ID n'est pas un ObjectId valide, il doit * lancer * une exception IllegalArgumentException et non une exception NotFoundException. – metaforge

Questions connexes