2011-05-25 16 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(); 

這應該適用於嵌入或引用的集合。