2011-05-25 46 views
5

我有以下的游戏框架实体(使用吗啡的持久性)作为一个通用的博客应用程序的一部分:

@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; 
} 

的方法getLastCommentsByUsers()应该返回参数users中用户的所有评论,但我总是会收到一个空的List回来。 Commment是一个独立集合的原因是能够通过某些用户在其关联的Post上检索最后的X Comment,如果嵌入在Post集合中,这是不可能的。

我的查询是否有问题(应该使用hasAnyOf以外的东西),还是与关系映射有关?是否应该使用ObjectId而不是?

+0

请发表您的SiteUser类的样子。 – Ryan 2011-05-26 14:23:34

+0

@Ryan:完成。 :) – Rich 2011-05-26 22:13:30

回答

3

您应该使用List<Key<SiteUser>>查询:

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

或者你可以只是拿到钥匙:

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

这将返回以下错误:'java.lang.IllegalArgumentException:无法序列化类org.mongodb.morphia.Key'与Morphia v0.105 – Mark 2013-10-01 00:27:56

+0

这是一个回归,将在0.106中修复:https:// github.com/mongodb/morphia/issues/529 – xeraa 2013-12-16 04:39:06

6

我使用带有列表或集合的in()方法,并且其工作完美。这里有一个片段:

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

这应该适用于嵌入或引用的集合。