java - 客户端排序 + Hibernate 分页?

标签 java hibernate gwt pagination

我将 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/

相关文章:

java - 通过 OSMDroid 使用在线存储中的 MBTiles

java - 为什么我不能在 Java 中覆盖方法 wait()?

java - 我可以通过 hibernate Session.load 只更新或设置一个实体字段而不加载整个对象吗?

GWT : Celltable Multiselection , MouseDown 事件?

java - Glassfish 4 中的 slf4j jar 文件放在哪里?

java - 由于线程挂起而导致递归问题

java - 我可以将 @EntityGraph 应用于 @Query 吗?

java - 多对多hibernate xml配置

java - GWT 对话框从不显示 - 帮助

file - 在 GWT 项目中写入文本文件?