假设我有一个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集合类型,该类型可以管理分页,排序和搜索)。
PS:我最近找到了Play!框架在JPA上使用了一个非常有趣的库:Siena。Siena非常易于使用,并且是JPA / Hibernate的良好抽象。但是我找不到如何对其关联进行分页。
更新:
Play框架的查询语法类似于Django:
Post.findAll().from(100).fetch(10); // paging
哪里
Post.findAll()
将返回JPAQuery对象,这是Play中的自定义查询类型。
但是具有相关的集合,例如:
Post.comments
只会返回一个不支持分页或其他查询的列表。
我想知道如何扩展它,以便
还将返回一个JPAQuery对象或类似的对象,然后您可以在“查询”集合上进行查询:
Post.comments.from(100).fetch(10);
或插入一个新的Comment而不实际获取任何评论:
Post.comments.add(new Comment(...));
我的第一个想法是,我们可以创建List的子类,然后Post类将变为:
@Entity class Post { ... @OneToMany QueryList<Comment> comments; ... }
和QueryList将具有间接访问JPAQuery的fetch(),from()方法。
但是我不知道Hibernate / JPA是否会识别或干扰它。
是否可以在JPA(…)上使用@OneToMany集合来模拟动态分页?
不支持。标准方法是使用JPQL查询来检索给定帖子的评论,并使用Query#setFirstResult(int)和Query#setMaxResults(int)。
Query#setFirstResult(int)
Query#setMaxResults(int)
我的第一个想法是,我们可以创建List(…)的子类。但是我不知道Hibernate / JPA是否会识别或干扰它。
显然,如果没有一个 沉重的 补丁来彻底改变默认行为,那将是不可能的。