hibernate 分页限制问题?

POwner 2010-04-27 04:13:17
我在hibernate中用setFirstResult setMaxResult
List items = criteria.setFirstResult((pageno - 1) * pageSize).setMaxResults(pageSize).list();
这样我只能实现翻页,但数据太多有7W条且关联表多,翻到最后一页时非常慢。
我现在想只查询出前500条数据来分页,有什么好办法。
谢谢各位!
...全文
146 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
BearKin 2010-04-28
  • 打赏
  • 举报
回复
看看控制台输出的语句 语句没问题那就是你的问题了 可能你最后一页做了什么操作
小霍夫 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 bearkin 的回复:]
引用 9 楼 powner 的回复:
引用 7 楼 sgcl 的回复:
很简单。


Java code

int maxRecords = 500;
int startNum = (pageNo - 1)* pageSize;
int endNum = (maxRecords - startNum) % pageSize;

if (endNum <= 0) {

//……
[/Quote]


我用的是mysql
小霍夫 2010-04-28
  • 打赏
  • 举报
回复
我现在有1w多条记录。
没出现过lz这样的情况。。关联表一样很多!

这样我只能实现翻页,但数据太多有7W条且关联表多,翻到最后一页时非常慢


能发表下看法吗?

因为7w多条记录,到了后面越来越慢.!这句。为什么会越来越慢呢! 我倒是很想知道.因为我没出现这种现象!
BearKin 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 powner 的回复:]
引用 7 楼 sgcl 的回复:
很简单。


Java code

int maxRecords = 500;
int startNum = (pageNo - 1)* pageSize;
int endNum = (maxRecords - startNum) % pageSize;

if (endNum <= 0) {

//超出最大数据量
//不用搜索
}
……
[/Quote]

实际上这个问题可以搜索下 因为用过HIBERNATE的人应该知道 SQLSERVER 都是用伪分页实现的 (用TOP不能达到完美) 他先是用TOP查询 然后再在内存中进行假分页

不过2005就好多了 因为有了类似Oracle的rownum的函数
http://blog.csdn.net/tdl982324/archive/2008/07/03/2607674.aspx
需要重写方言
huihui0929 2010-04-28
  • 打赏
  • 举报
回复
我来帮你顶一下,也学习学习,呵呵
POwner 2010-04-28
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sgcl 的回复:]
很简单。


Java code

int maxRecords = 500;
int startNum = (pageNo - 1)* pageSize;
int endNum = (maxRecords - startNum) % pageSize;

if (endNum <= 0) {

//超出最大数据量
//不用搜索
}
else {
……
[/Quote]
谢谢了,你这样还是会查询统计所有的记录,只是不让翻页到500条记录以后,而已!
大虾么,没有更好的办法么?我的数据库是sqlserver 2005.当然用sql可以,但我不想用sql
wanghao198612 2010-04-27
  • 打赏
  • 举报
回复
只查询出前500条数据来分页?
分页的本质是只查出固定的数量的记录,如果你把500条全查出来再分页,那可以不用分页了,在显示的时候把显示的记录调整好就够了。
平淡面对 2010-04-27
  • 打赏
  • 举报
回复
很简单。


int maxRecords = 500;
int startNum = (pageNo - 1)* pageSize;
int endNum = (maxRecords - startNum) % pageSize;

if (endNum <= 0) {

//超出最大数据量
//不用搜索
}
else {
List items = criteria.setFirstResult(startNum).setMaxResults(endNum).list();

}


yang1707 2010-04-27
  • 打赏
  • 举报
回复
如果数据库是oracle的话可以加一条:
criteria.add(Restrictions.sqlRestriction("ROWNUM <= 500"))
lifengat 2010-04-27
  • 打赏
  • 举报
回复
你在hql后面加个条件 rowid < 50可以么?
lp19890601 2010-04-27
  • 打赏
  • 举报
回复
优化..............
POwner 2010-04-27
  • 打赏
  • 举报
回复
还有最重要的问题,我如何用hibernate控制只在前500条数据翻页????????我最想知道这个。
POwner 2010-04-27
  • 打赏
  • 举报
回复
我可以在代码里配置减少关联对象?
如查询task列表时,我需要servicerequest对象关联,但servicerequest有关联着个多的别的关联,我如何控制servicerequest只取我想要的数据?
<hibernate-mapping package="com.newchina.po">
<class name="Task" table="Task" dynamic-insert="true" dynamic-update="true">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
......
<many-to-one name="serviceRequest" column="ServiceRequest" class="ServiceRequest" cascade="none" />
hao1314 2010-04-27
  • 打赏
  • 举报
回复
关联对象不需要时,就配置一下,不要查询时,也去查询关联对象啊!

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧