5

一般的なブログアプリの一部として、次の 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();
    }

}

サイトユーザー:

@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ます。が別のコレクションである理由は、特定のユーザーが関連付けられたCommmentから最後の X を取得できるようにするためです。これは、 がコレクションに埋め込まれている場合は不可能です。CommentPostCommentPost

クエリに何か問題がありますか ( 以外のものを使用する必要がありますhasAnyOf)、または関係マッピングに問題がありObjectIdますか? 代わりに使用する必要がありますか?

4

2 に答える 2

6

私はリストまたはセットでin()メソッドを使用し、それは完全に機能します。スニペットは次のとおりです。

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

これは、埋め込みまたは参照のコレクションでも機能するはずです。

于 2011-05-28T03:05:32.950 に答える
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();
于 2011-06-08T12:03:43.393 に答える