我有以下Play Framework实体(使用Morphia进行持久化)作为通用博客应用程序的一部分:
@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
是一个单独的集合的原因是,某些用户可以在其关联的Comment
中检索最后的X Post
,如果Comment
则无法检索}嵌入在Post
集合中。
我的查询是否有问题(我应该使用hasAnyOf
以外的其他内容),还是关系映射存在问题?我应该使用ObjectId
吗?
答案 0 :(得分:6)
我将in()方法与列表或集合一起使用,并且它完美地工作。这是一个片段:
List<String> keywordList;
List<Product> products = Product.find().field("keywords").in(keywordList).asList();
这也适用于嵌入式或引用的收集。
答案 1 :(得分: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();