2

我正在使用休眠 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)工作的?它会从数据库中获取所有数据,然后result-set根据 first 和 max 参数对其进行过滤吗?还是仅根据索引中的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

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

提前致谢。

4

1 回答 1

1

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

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

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

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

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

于 2013-10-15T13:35:53.313 回答