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 がこれを認識するか、干渉するかはわかりません。