在java中实现分页的最佳方式

时间:2013-10-15 13:29:20

标签: java sql hibernate pagination

我正在使用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)&amp; query.setFirstResult(firstResult)方法有效吗?它会从DB获取所有数据,然后根据first和max参数从result-set过滤掉它吗?或者它是否仅根据max-result索引中的first-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

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

提前致谢。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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