我正在使用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
所以很明显,时间与页码成正比。有没有办法保持一个恒定的执行速度,无论页码多少?因为我们总是获取相同数量的记录。
提前致谢。
答案 0 :(得分:1)
Hiberante .setMaxResults()
和.setFirstResult()
是设置,将根据所选的Dialect使用的数据库引擎应用。
在大多数情况下,这会产生预期的行为:数据库服务器端的分页。这是如何为客户端(应用程序)获取页面的最佳方式。
在某些情况下,当较旧的数据库引擎不支持分页时,Hibernate会尝试至少做到最好......例如如果只有第5页需要20行(我记得有一些Sybase版本或SQL Server 2000),那么要占用前100行;
真正的SQL语句由Dialect驱动。例如。不同可能是SQL Server 2008和SQL 2012上的分页......
是的,这是如何使用Hibernate进行分页的正确方法......