通过Morphia使用$ in运算符-做错了吗?

问题描述

| 作为通用博客应用程序的一部分,我具有以下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;

}
抽象用户:
public class AbstractUser extends Model {

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

    @Required
    public String password;
}
方法
getLastCommentsByUsers()
应该返回用户在
users
参数中的所有注释,但是我总是会得到一个空的
List
返回。 “ 6”是一个单独的集合的原因是,某些用户可以跨关联的“ 8”检索到最后X个“ 7”,如果在“ 8”集合中嵌入了“ 7”,则不可能。 我的查询是否有问题(我应该使用的不是
hasAnyOf
),还是关系映射存在问题-我应该改用
ObjectId
?     

解决方法

您应使用
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();
    ,我将in()方法与列表或集合一起使用,并且可以完美地工作。这是一个片段:
List<String> keywordList;
List<Product> products = Product.find().field(\"keywords\").in(keywordList).asList();
这也应该适用于嵌入式或引用的收集。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...