2009-12-17 55 views
3

我使用GWT作为UI和Hibernate/Spring的buisness-layer.Following GWT小部件用于显示记录。(http://collectionofdemos.appspot.com/demo/com.google.gwt.gen2.demo.scrolltable.PagingScrollTableDemo/PagingScrollTableDemo.html)。我假设排序在客户端完成。客户端排序+休眠寻呼?

我不检索整个结果集,因为它的巨大。 我使用

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

以检索data.Theres没有标准在休眠层排序。

此方法不会给出正确的行为,因为它只对客户端中的当前数据集进行排序。

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

注:我可以使用UI框架获取主排序列和其他排序列。 可能我可以使用主要排序列在休眠层排序结果?

回答

4

您需要在服务器上排序。

此后,您可以:

  • 发送完整的结果集到客户端和手柄分页在客户端。问题是结果集可能很大,从数据库中检索并发送到客户端。

  • 处理服务器端分页。客户端和服务器一次只从数据库请求一个页面。接下来的问题是,每次你向db请求一个特定的页面时,你都会一次又一次地排序相同的数据来提取页面1,页面2等等。这可能是大型数据库的问题。

  • 兼得之间的权衡(大型数据库):

    • 设定一个上限,比如300项
    • 的服务器请求的第一个301个项目分贝根据订单通过
    • 服务器在缓存
    • 客户端请求的页面服务器页面keept结果集(最多301项)
    • 服务器处理ŧ他使用缓存分页
    • 如果有301个项目,客户端显示“该命中列表包含超过300个项目。它已被截断“。

注1:通常情况下,客户并不关心,如果他不能去最后一页。您可以改进解决方案,先计算总行数(此时不需要订购),以便您可以显示对用户更好的消息,例如, “结果包含2023个元素,只有前300个可以查看”。注2:如果您在不使用任何顺序标准的情况下逐页请求数据的数据,大多数数据库(至少Oracle)不保证任何排序。因此,如果向数据库发出两个请求,则可能在第1页和第2页中有相同的项目。如果多个项目具有相同的值(例如相同日期),则会发生同样的问题。数据库不保证具有相同值的元素之间的任何顺序。如果是这种情况,那么我会建议使用PK作为最后的命令标准来排序(例如ORDER BY date, PK),以便以一致的方式完成寻呼。

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

1

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

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

这只会在服务器上留下排序和分页。您可以使用Criteria.addOrder()在休眠中进行排序。见this tutorial

3
  1. 总是有一个排序列。默认情况下,它可以通过“名称”或“ID”
  2. 使用服务器端分页。即传递当前页面索引并获取适当的数据子集。
  3. 在提取标准/查询中使用排序列。如果客户端未选择任何内容,请使用默认值。

因此,您将拥有自己想要的行为而不需要权衡。

+0

但是,然后数据库会反复排序相同的数据,每次请求一个页面,不是? – ewernli 2009-12-17 10:01:35