我将 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 对结果进行排序?
最佳答案
你需要在服务器上排序。
然后你可以:
将完整的结果集发送给客户端并在客户端处理分页。问题是结果集可能很大,无法从数据库中检索并发送到客户端。
在服务器端处理分页。客户端和服务器一次只从数据库请求一页。那么问题是,每次向数据库询问特定页面时,您都会一次又一次地订购相同的数据以提取第 1 页、第 2 页等。这可能是大型数据库的问题。
在两者之间进行权衡(对于大型数据库):
- 设置一个限制,比如 300 件
- 服务器根据 order by 向 db 请求前 301 个项目
- 服务器将结果集(最多 301 项)保存在缓存中
- 客户端逐页请求服务器
- 服务器使用缓存处理分页
- 如果有301条,客户端显示“命中列表超过300条,已被截断”。
注1:通常情况下,客户并不关心是否能走到最后一页。您可以改进解决方案以首先计算总行数(到那时不需要排序),以便您可以显示对用户更好的消息,例如"结果包含2023个元素,只能查看前300个"。
注意 2:如果您在数据库中逐页请求数据而不使用任何顺序标准,大多数数据库(至少 Oracle)不保证任何顺序。因此,如果您向数据库发出两次请求,您可能在第 1 页和第 2 页中有相同的项目。如果多个项目具有用于订购的相同值(例如相同日期),则会发生相同的问题。数据库不保证具有相同值的元素之间的任何排序。如果是这种情况,我会建议使用 PK 作为最后的排序标准(例如 ORDER BY date, PK
),以便以一致的方式完成分页。
注意 3:我说的是客户端和服务器,但您可以根据您的具体情况调整这个想法。
关于java - 客户端排序 + Hibernate 分页?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1920209/