锁定老帖子 主题:Hibernate的优化:分页
精华帖 (6) :: 良好帖 (14) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-27
my_corner 写道 return getLimitString(query, offset > 0); 这个直接 return getLimitString(query, true); 甚至 return getLimitString(query); 后面那个参数没看到有用啊 |
|
返回顶楼 | |
发表时间:2010-07-28
風一樣的男子 写道 my_corner 写道 return getLimitString(query, offset > 0); 这个直接 return getLimitString(query, true); 甚至 return getLimitString(query); 后面那个参数没看到有用啊 貌似是这样的,是不是lz的代码没粘贴全啊 |
|
返回顶楼 | |
发表时间: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 ); } |
|
返回顶楼 | |
发表时间:2010-07-28
ming123 写道 風一樣的男子 写道 my_corner 写道 return getLimitString(query, offset > 0); 这个直接 return getLimitString(query, true); 甚至 return getLimitString(query); 后面那个参数没看到有用啊 貌似是这样的,是不是lz的代码没粘贴全啊 呵呵,粘全了 |
|
返回顶楼 | |
发表时间: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,但也不是全取出来。 |
|
返回顶楼 | |
发表时间:2010-07-29
LZ好像对SQL SERVER 的分页语句不是很熟悉啊
mysql 是 limit Oracle 是你文中所描述的 3层嵌套查询 而sql server 从久远的历史来看,就是用top来分页的, 你所看到的东西没什么不对的地方 |
|
返回顶楼 | |
发表时间:2010-07-29
你别管HIBERNATE 是如何实现的,如果自己写SQL的话,把分页语句实现……
除了LS有说到的 row_number() over外,不用top,LZ可以尝试写一个分页来体验一下 |
|
返回顶楼 | |
发表时间: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 是把说有数据载入内存,进行假分页。 |
|
返回顶楼 | |
发表时间:2010-07-29
分离的北极熊 写道 LZ好像对SQL SERVER 的分页语句不是很熟悉啊
mysql 是 limit Oracle 是你文中所描述的 3层嵌套查询 而sql server 从久远的历史来看,就是用top来分页的, 你所看到的东西没什么不对的地方 兄弟,sql server 2000只能top 分页不假,可是hibernate里的sql server是错误的。并不是top的嵌套查询,只是简单的top查询。然后在内存中进行的分页。你可以自己写个例子,打开sql语句验证一下。楼上有位同学也遇到过这个问题,自己去试试吧。 |
|
返回顶楼 | |
发表时间:2010-07-29
分离的北极熊 写道 你别管HIBERNATE 是如何实现的,如果自己写SQL的话,把分页语句实现……
除了LS有说到的 row_number() over外,不用top,LZ可以尝试写一个分页来体验一下 ls是有说过用 rownumber分页的,而且我也已经写在方言里了。我也没说分页不能用top,我是说hibernate里的top分页是不对的。 下次请您看清帖子的内容,再回复,谢谢! |
|
返回顶楼 | |