如何使用@OneToMany集合进行分页
假设我有一个Post实体和一个Comment实体以及一对多的关系:
@Entity class Post { ... @OneToMany List 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
将只返回一个List,它不支持分页或其他查询。
我想知道如何扩展它,所以
Post.comments
还将返回一个JPAQuery对象或类似的东西,然后你可以查询“查询”集合:
Post.comments.from(100).fetch(10);
或插入新的评论而不实际获取任何评论:
Post.comments.add(new Comment(...));
在我的第一个想法,我们可以创建一个List的子类,然后Post类将成为:
@Entity class Post { ... @OneToMany QueryList comments; ... }
而且QueryList将具有fetch(),from()方法,间接于JPAQuery。
但我不知道Hibernate / JPA是否会识别它,或者干扰它。
是否可以在JPA(…)之上使用@OneToMany集合模拟动态分页
不支持。 标准方法是使用JPQL查询来检索给定post的注释,并使用Query#setFirstResult(int)
和Query#setMaxResults(int)
。
在我的第一个想法,我们可以创建List的子类,(…)。 但我不知道Hibernate / JPA是否会识别它,或者干扰它。
显然,如果没有大量补丁来彻底改变默认行为。
我认为“正确”的方式可能更像:
@Entity class Post { ... public GenericModel.JPAQuery getComments() { return Comment.find("post_id = ?", post_id); } }
然后使用JPAQuery
一个fetch
方法 :
// fetch first page of results, 25 results per page post.getComments().fetch(1,25);
- Hibernate获取具有多个关联
- 如何在hibernate实体中通过几列定义索引?
- JavaFX + Hibernate(JPA)持久性+ Derby DB
- 如何在hibernate中启用批量插入?
- org.springframework.dao.DataIntegrityViolationException误报原因?
- hibernate:创建索引
- ClassNotFoundException:org.hibernate.hql.internal.ast.HqlToken甚至在添加了classic.ClassicQueryTranslatorFactory 之后
- FetchMode连接对spring JPA存储库中的ManyToMany关系没有任何区别
- JPA / Hibernate使用共享主键进行单向一对一映射