2015-10-18 76 views
0

我正在写这个在我的手机上飞,所以原谅蹩脚的代码示例。休眠分页与____ToMany映射

我有实体用多对多关系:

@JoinTable(name="foo", @JoinColum="...",   @InverseJoinColumn="...") 
@ManyToMany 
List list = new ArrayList(); 

我想在一个分页的方式来获取他们的数据。

我知道关于setFirstResult和setMaxResults。有没有办法在映射中使用它?如在,我检索对象,并获得与内容相等的单个页面的记录数量与相应的偏移量。

我想我只是不清楚最好的方式来做到这一点。我可以手动使用hibernate标准来产生效果,但是我觉得缺少API。我有这个映射,我想看看是否有一种方法来以分页的方式使用它。

PS。如果这不切实际,就说。另外,如果是这样,我是否仍然可以使用映射将新条目添加到连接表中。如果实体是数据库中的持久实体,但我没有提取多个列表,我可以添加新的东西,当它保持级联时,它将被添加到连接表中而不清除其他条目?

回答

0

作为查询一部分的实体之间的关系类型并不重要。有几种方法可以解决这个问题。

  1. 如果你的数据库支持它的查询LIMIT关键字,你就可以用它来获取数据集,假设你排序您的数据。请注意,如果您的数据在您的用户在页面之间导航时发生变化,您可能会看到一些重复或丢失了一些记录。如果您的数据库更改为没有LIMIT关键字的数据库,那么您将不得不重写。

  2. 如果您需要冻结原始查询时的数据,您需要使用第三方框架或编写自己的代码来获取查询的ID列表,然后拆分该列表并通过ID获取分页的子集。这对于任何数据库都是可靠的。

Displaytag是我用过的数据分页框架,因此我可以告诉你对于大型数据集很好。它也是这个问题的老式解决方案之一,不是扩展框架的一部分。 http://displaytag.sourceforge.net/11/tut_externalSortAndPage.html

表分拣机是我遇到的另一个。这个人使用JQuery并在一个查询中获取整个数据集,所以严格来说,它不符合“以分页方式获取数据”标准。 (这可能不适合大集合)。如果你已经在使用一个框架来看看该框架是否已经解决分页 http://theopentutorials.com/examples/java-ee/jsp/pagination-in-servlet-and-jsp/

http://tablesorter.com/docs/

本教程可能会有所帮助 的Spring MVC提供了一个数据寻呼机 http://blog.fawnanddoug.com/2012/05/pagination-with-spring-mvc-spring-data.html

GWT提供了一个数据寻呼机: http://www.gwtproject.org/javadoc/latest/com/google/gwt/user/cellview/client/SimplePager.html

以下参考也可能有帮助:

JDBC Pagination 也指出: http://java.avdiel.com/Tutorials/JDBCPaging.html