我将GWT用于UI,将Hibernate / Spring用于业务层。以下GWT小部件用于显示记录。(http://collectionofdemos.appspot.com/demo/com.google.gwt.gen2.demo.scrolltable.PagingScrollTableDemo /PagingScrollTableDemo.html)。我认为排序是在客户端完成的。
由于其庞大,我不会检索整个结果集。我用
principals = getHibernateTemplate().findByCriteria(criteria, fromIndex, numOfRecords);
检索数据。在Hibernate层中没有排序标准。
该方法没有给出正确的行为,因为它仅对客户端中的当前数据集进行排序。
解决此问题的最佳方法是什么?
注意:我可以使用UI框架获取主排序列和其他排序列。可以在hibernate层中使用primary-sort-column对结果进行排序吗?
您需要在服务器上排序。
然后您可以:
将完整的结果集发送给客户端,并在客户端 处理分页 。问题在于结果集可能很大,无法从db检索并发送给客户端。
在服务器端处理分页 。客户端和服务器一次仅从数据库请求一页。然后的问题是,每次您向数据库请求特定页面时,您将一次又一次地命令相同的数据以提取页面1,页面2等。这可能是大型数据库的问题。
两者之间要进行 权衡 (对于大型数据库):
注意1:通常,客户不在乎是否无法进入最后一页。您可以改进解决方案以首先计算行总数(此后无需排序),以便可以显示对用户更好的消息,例如“结果包含2023个元素,只能查看前300个元素”。
注意2:如果您不使用任何排序条件就在数据库中逐页请求数据,则大多数数据库(至少Oracle)不保证 任何 排序。因此,如果您对数据库发出两个请求,则第1页和第2页中的项目可能相同。如果多个项目具有用于订购的相同值(例如,相同的日期),则会发生相同的问题。db不能保证具有相同值的元素之间的任何排序。如果是这种情况,那么我建议使用PK作为(例如ORDER BY date, PK)排序的最后排序标准,以便以一致的方式完成分页。
ORDER BY date, PK
注意3:我谈论的是客户端和服务器,但是您可以根据自己的具体情况来调整想法。