2011-05-25 3 views
5

je Play entité cadre suivante (en utilisant Morphia de persistance) dans le cadre d'une application de blogging générique:

@Entity 
public class Comment extends Model { 

    ... 

    @Reference 
    @Indexed 
    public SiteUser commenter; 

    public static List<Comment> getLastCommentsByUsers(final List<SiteUser> users) { 
     final Query<Comment> query ds().createQuery(Comment.class); 
     query.field(commenter).hasAnyOf(users); 
     return query.asList(); 
    } 

} 

Siteuser:

@Entity(noClassnameStored=true) 
public class SiteUser extends AbstractUser { 

    public String realName; 

} 

AbstractUser:

public class AbstractUser extends Model { 

    @Indexed(value= IndexDirection.DESC, unique = true) 
    public String emailAddress; 

    @Required 
    public String password; 
} 

La méthode getLastCommentsByUsers() est censé retourner tous les commentaires des utilisateurs dans le paramètre users, mais je reçois toujours un 01 videretour. La raison pour laquelle Commment est une collection séparée est de pouvoir récupérer les derniers X Comment s par certains utilisateurs à travers leurs Post s associés, ce qui n'est pas possible si le Comment est incorporé dans la collection Post.

Y at-il un problème avec ma requête (devrais-je utiliser autre chose que hasAnyOf), ou est-ce un problème avec le mappage de relation - dois-je utiliser ObjectId à la place?

+0

S'il vous plaît poster ce que votre classe Siteuser ressemble. – Ryan

+0

@Ryan: terminé. :) – Rich

Répondre

3

Vous devez utiliser List<Key<SiteUser>> pour interroger:

public static List<Comment> getLastCommentsByUsers(final List<SiteUser> users) { 
    final Query<Comment> query ds().createQuery(Comment.class); 
    query.field(commenter).hasAnyOf(toKeys(users)); // convert to keys 
    return query.asList(); 
} 

public static List<Key<SiteUser>> toKeys(List<SiteUser> users) { 
    List<Key<SiteUser>> keys = new ArrayList<Key<SiteUser>>(); 
    for(SiteUser user: users) { 
     keys.add(ds().getMapper().getKey(user)); 
    } 
    return keys; 
} 

Ou vous pouvez simplement obtenir les clés par:

List<Key<SiteUser>> keys = ds().createQuery(SiteUser.class).query().filter(...).asKeyList(); 
+0

Cela renvoie l'erreur suivante: 'java.lang.IllegalArgumentException: ne peut pas sérialiser classe org.mongodb.morphia.Key' avec Morphia v0.105 – Mark

+0

Ceci est une régression et sera corrigé dans 0,106: https: // github.com/mongodb/morphia/issues/529 – xeraa

6

J'utilise la méthode() avec une liste ou un ensemble et son parfait état de fonctionnement. Voici un extrait:

List<String> keywordList; 
List<Product> products = Product.find().field("keywords").in(keywordList).asList(); 

Cela devrait fonctionner aussi bien pour la collection d'embedded que pour les références.