当前位置: 首页 > 面试题库 >

客户端排序+休眠分页?

阎璞瑜
2023-03-14
问题内容

我将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等。这可能是大型数据库的问题。

  • 两者之间要进行 权衡 (对于大型数据库):

    • 设置一个限制,例如300个项目
    • 服务器按照以下顺序向数据库询问前301个项目:
    • 服务器将结果集(最多301个)保留在缓存中
    • 客户端逐页请求服务器
    • 服务器使用缓存处理分页
    • 如果有301个项目,则客户端显示“命中列表包含300多个项目。它已被截断”。

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

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

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



 类似资料:
  • 问题内容: 我有一个带有自动加载行的树形网格。目标是在 客户端 按树列对网格进行排序。 但是,每次单击排序列标题时,都会 发出 Ajax调用以进行排序,但是我所需要的只是使用本地数据进行就地排序。 我的网格参数是否不正确,或者树无法与树列的客户端排序配合使用? 当前用于排序的jqGrid参数为: 问题答案: 为了使客户端排序正常工作,我需要在加载网格后调用: 我不必在应用程序的另一个网格上执行此操

  • 问题内容: 我正在尝试对查询使用Hibernate分页(PostgreSQL) 我设置,我的SQL查询。我的代码如下: 但是当查看SQL Hibernate日志时,我仍然看到完整的SQL查询: 为什么在Hibernate分页SQL日志查询中没有LIMIT OFFSET? 有人知道Hibernate分页机制吗? 我猜Hibernate将选择所有数据,将数据放入Resultset,然后在Results

  • 问题内容: 显示标签提供给定对象的分页功能。Hibernates提供了仅提取每页所需记录的选项。在我的项目中,我们同时使用了这两个概念。 显示广告代码:我需要根据过滤条件提取所有记录并将其存储在会话中。然后这个displaytag将负责所有分页和排序。因此Httpsession拥有很多数据。 hibernate:它仅从数据库中获取请求的对象数,无需为每个请求打开会话。 最好的做事方法是什么?或者如

  • 问题内容: 如果我能以某种方式将这两个框架结合在一起,那就太酷了。 单击Primefaces数据表上的下一个或上一个按钮将触发查询,从而使用JPA限制查询结果。 同样,也许通过某种机制,primefaces组件也可以从另一个JPA选择计数查询中获取总页数。 有没有关于如何将它们投入工作的示例? 请分享您的经验。 谢谢 ! 问题答案: 您可以使用LazyDataModel。在此示例中,我将使用Net

  • 问题内容: 我有一个使用hibernate条件创建的查询,如下所示: 我希望排序不区分大小写,等同于HQL查询 如何使用hibernate条件实现此目的? 问题答案:

  • 问题内容: 我的数据库是Oracle,我的id列值是Oracle序列,此序列由触发器执行,因此,在插入每一行之前,此触发器使用此序列来获取id值。因此,我对应该在实体类中定义哪个id策略生成感到困惑。 要么 要么 真的很困惑,有人可以阐明这个话题吗?请清楚解释。 问题答案: 我还有一个projet,其中有一个Oracle DB将数据提供给我的@Entity类。如您所说,序列通过触发器生成表PK的I