如何使用@OneToMany集合进行分页

Vis*_*hao 16 java hibernate jpa siena playframework

假设我有一个Post实体和一个Comment实体以及一对多的关系:

@Entity class Post {
    ...
    @OneToMany
    List<Comment> comments;
    ...
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能实现这样的分页:

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

是否可以在JPA之上使用@OneToMany集合模拟动态分页,或者我们是否必须完全重写JPA的关联机制?(例如,创建一个可以管理分页,排序和搜索的PersistentList集合类型).

PS:我最近发现了Play!框架在JPA:Siena之上使用了一个非常有趣的库.Siena非常易于使用,并且在JPA/Hibernate之上是一个很好的抽象.但我找不到如何使用其关联进行分页.

更新:

Play框架具有类似于Django的查询语法:

Post.findAll().from(100).fetch(10);  // paging
Run Code Online (Sandbox Code Playgroud)

哪里

Post.findAll() 
Run Code Online (Sandbox Code Playgroud)

将返回一个JPAQuery对象,一个Play中的自定义查询类型.

但是有关联的集合,例如:

Post.comments
Run Code Online (Sandbox Code Playgroud)

将只返回一个List,它不支持分页或其他查询.

我想知道如何扩展它,所以

Post.comments
Run Code Online (Sandbox Code Playgroud)

还会返回一个JPAQuery对象或类似对象,然后就可以查询"查询"集合:

Post.comments.from(100).fetch(10);
Run Code Online (Sandbox Code Playgroud)

或插入新的评论而不实际获取任何评论:

Post.comments.add(new Comment(...));
Run Code Online (Sandbox Code Playgroud)

在我的第一个想法,我们可以创建一个List的子类,然后Post类将成为:

@Entity class Post {
    ...
    @OneToMany
    QueryList<Comment> comments;
    ...
}
Run Code Online (Sandbox Code Playgroud)

而且QueryList将具有fetch(),from()方法,间接于JPAQuery.

但我不知道Hibernate/JPA是否会识别它,或者干扰它.

Pas*_*ent 7

是否可以在JPA(...)之上使用@OneToMany集合模拟动态分页

不支持.标准方法是使用JPQL查询来检索给定帖子的注释以及使用Query#setFirstResult(int)Query#setMaxResults(int).

在我的第一个想法,我们可以创建一个List的子类,(...).但我不知道Hibernate/JPA是否会识别它,或者干扰它.

显然,如果没有大量补丁来彻底改变默认行为.

  • `我真的很想知道怎么不检索整个集合.使它成为LAZY,甚至可能[EXTRA](http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/# entity-hibspec-singleassoc-fetching)懒惰.`或者,在为集合手动创建JPQL查询的情况下,这是否意味着我们仅将关联集合用于映射?`也用于查询. (2认同)