【问题标题】:Best way to implement pagination in java在java中实现分页的最佳方法
【发布时间】:2013-10-23 08:00:39
【问题描述】:

我正在使用 hibernate api 的query.setMaxResults(maxResults) & query.setFirstResult(firstResult) 方法来实现分页。 MS SQLServer 2012 sp1 是我用于项目的数据库。

以下是示例查询:

SELECT a.c1, b.c2, b.c3 FROM Person as a WITH(NOLOCK), Address as b WITH(NOLOCK) where <condition> ORDER BY a.c1

query.setMaxResults(maxResults)query.setFirstResult(firstResult) 方法是如何工作的?它会从数据库中获取所有数据,然后根据 first 和 max 参数从result-set 中过滤吗?还是仅从first-result 索引中获取基于max-result 值的结果数?

用户觉得应用程序需要一些时间来使用数据更新 UI。那么推荐的分页方式是什么?我是否需要使用存储过程或其他方式来提高性能?请多多指教。

更新: 当用户选择第 1 页时,将执行以下查询:

SELECT top 200 a.c1, b.c2, b.c3 FROM Person as a WITH(NOLOCK), Address as b WITH(NOLOCK) where <condition> ORDER BY a.c1 - executed with 2502540 ms

当用户选择第 30 页时,将执行以下查询:

SELECT top 6000 a.c1, b.c2, b.c3 FROM Person as a WITH(NOLOCK), Address as b WITH(NOLOCK) where <condition> ORDER BY a.c1 - executed with 34220186 ms

所以很明显,时间与页码成正比。无论页码如何,有没有办法保持恒定的执行速度?因为我们总是获取相同数量的记录。

提前致谢。

【问题讨论】:

    标签: java sql hibernate pagination


    【解决方案1】:

    Hiberante .setMaxResults().setFirstResult() 是设置,将根据使用的数据库引擎和所选方言应用。

    在大多数情况下,这将执行预期的行为:在数据库服务器端分页。这确实是为您的客户(应用程序)获取页面的最佳方式。

    在某些情况下,当旧的数据库引擎不支持分页时,Hibernate 会尝试至少做到最好……例如取前 100 行,如果只需要 20 行的第 5 页(我记得有一些 Sybase 版本或 SQL Server 2000)

    真正的 SQL 语句是由方言驱动的。例如。 SQL Server 2008 和 SQL 2012 上的分页可能不同...

    是的,这是使用 Hibernate 进行分页的正确方法...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多