Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中实现分页的最佳方法_Java_Sql_Hibernate_Pagination - Fatal编程技术网

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

在java中实现分页的最佳方法,java,sql,hibernate,pagination,Java,Sql,Hibernate,Pagination,我正在使用HibernateAPI的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.c

我正在使用HibernateAPI的
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
当用户选择第30页时,执行以下查询:

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
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
a.c1、b.c2、b.c3前6000名,从a.c1订单执行时间为34220186毫秒的人员中选择a.c1、b.c2、b.c3,地址为b.WITH(NOLOCK)
所以很明显,时间和页码成正比。有没有一种方法可以在不考虑页码的情况下保持恒定的执行速度?因为我们总是获取相同数量的记录


提前感谢。

Hibernate
.setMaxResults()
.setFirstResult()
是设置,将根据所选方言使用的DB引擎应用这些设置

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

在某些情况下,当旧的DB引擎不支持分页时,Hibernate将尝试至少做到最好。。。e、 g.如果只需要第5页的20行(我记得有一些Sybase版本或SQL Server 2000),则选择前100行

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

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