论坛首页 Java企业应用论坛

Hibernate的优化:分页

浏览 32527 次
精华帖 (6) :: 良好帖 (14) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-07-27  
my_corner 写道

return getLimitString(query, offset > 0);



这个直接
return getLimitString(query, true);

甚至
return getLimitString(query);

后面那个参数没看到有用啊
0 请登录后投票
   发表时间:2010-07-28  
風一樣的男子 写道
my_corner 写道

return getLimitString(query, offset > 0);



这个直接
return getLimitString(query, true);

甚至
return getLimitString(query);

后面那个参数没看到有用啊

貌似是这样的,是不是lz的代码没粘贴全啊
0 请登录后投票
   发表时间:2010-07-28  
風一樣的男子 写道
my_corner 写道

return getLimitString(query, offset > 0);



这个直接
return getLimitString(query, true);

甚至
return getLimitString(query);

后面那个参数没看到有用啊

这是重写的hibernate重写的Dialect这个抽象类中的方法。源代码中的两个方法如下:
/**
	 * Add a <tt>LIMIT</tt> clause to the given SQL <tt>SELECT</tt>
	 *
	 * @return the modified SQL
	 */
	public String getLimitString(String querySelect, boolean hasOffset) {
		throw new UnsupportedOperationException( "paged queries not supported" );
	}

	public String getLimitString(String querySelect, int offset, int limit) {
		return getLimitString( querySelect, offset>0 );
	}
0 请登录后投票
   发表时间:2010-07-28  
ming123 写道
風一樣的男子 写道
my_corner 写道

return getLimitString(query, offset > 0);



这个直接
return getLimitString(query, true);

甚至
return getLimitString(query);

后面那个参数没看到有用啊

貌似是这样的,是不是lz的代码没粘贴全啊

呵呵,粘全了
0 请登录后投票
   发表时间:2010-07-28  
我记得Hibernate对Mssql的分页是这样处理的。比如说每页10条,取第10页。

select top 10
from (select Top 100 from Table_A order by id) a
order by a.id desc

确实是只用了top,但也不是全取出来。
0 请登录后投票
   发表时间:2010-07-29  
LZ好像对SQL SERVER 的分页语句不是很熟悉啊

mysql 是 limit
Oracle 是你文中所描述的 3层嵌套查询
而sql server 从久远的历史来看,就是用top来分页的, 你所看到的东西没什么不对的地方

0 请登录后投票
   发表时间:2010-07-29  
你别管HIBERNATE 是如何实现的,如果自己写SQL的话,把分页语句实现……

除了LS有说到的 row_number() over外,不用top,LZ可以尝试写一个分页来体验一下
0 请登录后投票
   发表时间:2010-07-29  
zeroxy 写道
我记得Hibernate对Mssql的分页是这样处理的。比如说每页10条,取第10页。

select top 10
from (select Top 100 from Table_A order by id) a
order by a.id desc

确实是只用了top,但也不是全取出来。

我明白你的意思,不过你的写错了。
select top 10 from (select Top 100 from Table_A order by id asc) a order by a.id desc

我不知道你的hibernate是什么版本的,我的项目里确实是只有一条top,你可以打开sql 语句看看。每次翻页都是类似这种语句:select top 10000 id from table
是把说有数据载入内存,进行假分页。
0 请登录后投票
   发表时间:2010-07-29  
分离的北极熊 写道
LZ好像对SQL SERVER 的分页语句不是很熟悉啊

mysql 是 limit
Oracle 是你文中所描述的 3层嵌套查询
而sql server 从久远的历史来看,就是用top来分页的, 你所看到的东西没什么不对的地方


兄弟,sql server 2000只能top 分页不假,可是hibernate里的sql server是错误的。并不是top的嵌套查询,只是简单的top查询。然后在内存中进行的分页。你可以自己写个例子,打开sql语句验证一下。楼上有位同学也遇到过这个问题,自己去试试吧。
0 请登录后投票
   发表时间:2010-07-29  
分离的北极熊 写道
你别管HIBERNATE 是如何实现的,如果自己写SQL的话,把分页语句实现……

除了LS有说到的 row_number() over外,不用top,LZ可以尝试写一个分页来体验一下


ls是有说过用 rownumber分页的,而且我也已经写在方言里了。我也没说分页不能用top,我是说hibernate里的top分页是不对的。
下次请您看清帖子的内容,再回复,谢谢!
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics