17

Post エンティティと Comment エンティティ、および 1 対多の関係があるとします。

@Entity class Post {
    ...
    @OneToMany
    List<Comment> comments;
    ...
}

このようなページングを実現するにはどうすればよいですか:

Post post = //Find the post.
return post.getComments().fetch(100, 10); // Find the 11th page (page size 10);

JPA の上で @OneToMany コレクションを使用して動的ページングをエミュレートすることは可能ですか、それとも JPA の関連付けメカニズムを完全に書き直す必要がありますか? (たとえば、ページング、並べ替え、および検索を管理できる PersistentList コレクション型を作成します)。

PS: 最近 Play! を見つけました。フレームワークは、JPA: Siena の上で非常に興味深い lib を使用します。Siena は非常に使いやすく、JPA/Hibernate の優れた抽象化です。しかし、その関連付けでページングを行う方法が見つかりません。

アップデート:

Play フレームワークには、Django に似たクエリ構文があります。

Post.findAll().from(100).fetch(10);  // paging

どこ

Post.findAll() 

Play でカスタマイズされたクエリタイプである JPAQuery オブジェクトを返します。

ただし、関連するコレクションを使用すると、たとえば次のようになります。

Post.comments

ページングやその他のクエリをサポートしていないリストを返すだけです。

どのように拡張するかを考えていたので、

Post.comments

また、JPAQuery オブジェクトなどを返す場合は、「クエリ」コレクションに対してクエリを実行できます。

Post.comments.from(100).fetch(10);

または、実際にコメントを取得せずに新しいコメントを挿入します。

Post.comments.add(new Comment(...));

私が最初に考えたのは、List のサブクラスを作成すると、Post クラスは次のようになるということです。

@Entity class Post {
    ...
    @OneToMany
    QueryList<Comment> comments;
    ...
}

また、QueryList には、JPAQuery のメソッドを間接的に参照する fetch()、from() メソッドがあります。

しかし、Hibernate/JPA がこれを認識するか、干渉するかはわかりません。

4

2 に答える 2

8

JPA (...) の上に @OneToMany コレクションを使用して動的ページングをエミュレートすることは可能ですか?

サポートされていません。標準的なアプローチは、JPQL クエリを使用して特定の投稿のコメントを取得し、 and を使用することQuery#setFirstResult(int)ですQuery#setMaxResults(int)

私の最初の考えでは、List のサブクラスを作成することができました (...)。しかし、Hibernate/JPA がこれを認識するか、干渉するかはわかりません。

デフォルトの動作を大幅に変更するには、重いパッチが必要です。

于 2010-10-19T17:35:12.603 に答える
4

「正しい」方法は次のようになると思います。

@Entity
class Post {
    ...

    public GenericModel.JPAQuery getComments() {
        return Comment.find("post_id = ?", post_id);
    }
}

次に、 のいずれかのfetch 方法を使用しJPAQueryます。

// fetch first page of results, 25 results per page
post.getComments().fetch(1,25);
于 2011-01-21T22:41:42.487 に答える