客户端排序+ Hibernate分页?

时间:2009-12-17 08:19:24

标签: java hibernate gwt pagination

我使用GWT for UI和Hibernate / Spring for buisness-layer.Following GWT widget用于显示记录。(http://collectionofdemos.appspot.com/demo/com.google.gwt.gen2.demo.scrolltable.PagingScrollTableDemo/PagingScrollTableDemo.html)。我假设排序是在客户端完成的。

我没有检索整个结果集,因为它很庞大。 我用

principals = getHibernateTemplate().findByCriteria(criteria,
                    fromIndex, numOfRecords);

来检索数据。在Hibernate层中没有排序标准。

这种方法没有给出正确的行为,因为它只对客户端中的当前数据集进行排序。

这个问题的最佳解决方案是什么?

注意:我可以使用UI框架获取primary-Sort-column和其他排序列。 可能我可以使用hibernate层中的primary-sort-column对结果进行排序吗?

3 个答案:

答案 0 :(得分:4)

您需要对服务器进行排序。

然后你可以:

  • 将完整的结果集发送到客户端,处理客户端的分页。问题是结果集可能很大,无法从db检索并发送到客户端。

  • 处理服务器端的分页。客户端和服务器一次只从db请求一个页面。那么问题是,每次向db请求特定页面时,您将反复订购相同的数据以提取第1页,第2页等。这可能是大型数据库的问题。

  • 两者之间有权衡(适用于大型数据库):

    • 设置限制,比如300项
    • 服务器根据
    • 的顺序向db请求前301个项目
    • 服务器将结果集(最多301项)保存在缓存中
    • 客户端逐页请求服务器
    • 服务器使用缓存处理分页
    • 如果有301个项目,客户端会显示“命中列表包含超过300个项目。它已被截断”。

注1:通常,客户不关心他是否不能进入最后一页。您可以改进解决方案以首先计算总行数(此时不需要订购),以便您可以显示对用户更好的消息,例如“结果包含2023个元素,只能查看前300个元素。”

注意2:如果您在不使用任何订单标准的情况下逐页请求数据,则大多数db(至少Oracle)不保证任何排序。因此,如果您向数据库发出两个请求,则第1页和第2页中的项可能相同。如果多个项具有用于排序的相同值(例如,相同日期),则会出现同样的问题。 db不保证具有相同值的元素之间的任何排序。如果是这种情况,那么我建议使用PK作为最后的订单标准(例如ORDER BY date, PK),以便以一致的方式完成分页。

注3:我谈的是客户端和服务器,但您可以根据自己的具体情况调整这个想法。

答案 1 :(得分:3)

  1. 始终有一个排序列。默认情况下,它可以通过“name”或“id”
  2. 使用服务器端分页。即传递当前页面索引并获取适当的数据子集。
  3. 在获取条件/查询中使用排序列。如果客户端未选择任何一个,请使用默认值。
  4. 因此,您将获得所需的行为而无需权衡。

答案 2 :(得分:1)

如果您对GUI中的部分结果和服务器上的页面进行排序,则会使用户感到困惑。

由于数据集很大,将整个数据集发送给用户并进行分页和排序都是不行的。

只在服务器上留下排序和分页。您可以使用Criteria.addOrder()在hibernate中进行排序。请参阅this tutorial