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

时间:2010-10-19 16:48:59

标签: java hibernate jpa playframework siena

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

@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集合类型。)

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

更新:

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

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

,其中

Post.findAll() 

将返回JPAQuery对象,即Play中的自定义查询类型。

但是使用相关的集合,例如:

Post.comments

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

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

Post.comments

还将返回一个JPAQuery对象或类似对象,然后您可以查询“查询”集合:

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

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

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

在我第一次想到的时候,我们可以创建List的子类,然后Post类将成为:

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

和QueryList将具有fetch(),from()方法,间接到JPAQuery的。

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

2 个答案:

答案 0 :(得分:7)

答案 1 :(得分:3)

我认为“正确”的方式可能更像:

@Entity
class Post {
    ...

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

然后使用fetch中的JPAQuery methods之一:

// fetch first page of results, 25 results per page
post.getComments().fetch(1,25);