`

springside学习中遇到的问题

    博客分类:
  • Java
阅读更多
本想发在新手版上,又怕没人回答,麻烦指点后再帮我投新手贴,谢谢。
学习springside时候遇到个问题,问题如下:
HibernateGenericDao中
/** 
* 分页查询函数,使用hql. 
* 
* @param pageNo 页号,从0开始. 
*/ 
public Page pagedQuery(String hql, int pageNo, int pageSize, Object... values) { 
Assert.hasText(hql); 
//Count查询 
String countQueryString = " select count (*) " + removeSelect(removeOrders(hql)); 
List countlist = getHibernateTemplate().find(countQueryString, values); 
long totalCount = (Long) countlist.get(0);

if (totalCount < 1) return new Page(); 
//实际查询返回分页对象 
int startIndex = Page.getStartOfPage(pageNo, pageSize); 
Query query = getQuery(hql, values); 
List list = query.setFirstResult(startIndex).setMaxResults(pageSize).list();

return new Page(startIndex, totalCount, pageSize, list); 
}

中为什么这句
String countQueryString = " select count (*) " + removeSelect(removeOrders(hql)); 


需要先removeSelect?我们的sql不是可以这样的吗

select count (*) from (select ...)



后记:hibernate的设计原理还没看透,没有好好学习一下hibernate的官方文档(学习要塌实 ),不过到现在还没有兄弟秀一个好的解决方法出来哦
分享到:
评论
33 楼 fangang 2007-02-09  
Godlikeme 写道
嗯,这个比较明白,那就是返回记录数的sql写法问题。
没有看过源代码,但是猜测,removeOrders()应该把 order by ,group by 这些零碎都干掉了。
为什么前面不要写select count(*) from (select ...)
是因为没必要嵌套一个返回大量查询数据的子查询,效率比较低。

赞成Godlikeme的看法,要实现count,如果写成select count(*) from (select ...)效率是比较低的,因为数据库将先完成select ...以后才会执行select count(*),如果数据量大将会占用大量的时间和数据库资源。正确的写法是去掉select部分,加上select count(*),部分
32 楼 yueyemaitian 2007-02-02  
native sql里边都不能执行count(*)的。
31 楼 yueyemaitian 2007-02-02  
我也遇到了了这个问题,有没有谁有解决的办法呀?
30 楼 smilelee74 2007-01-22  
这种count(*)有问题,就是distinct不能使用。一旦碰到需要distinct的地方就会出错,例如页面上是2条但总记录数却显示成4条。
各位兄弟有没解决问题的办法啊?
29 楼 yb31 2006-12-31  
jianfeng008cn 写道
ls的兄弟,还有数据库不支持这样的子查询?能否举个例子呀,我现在就用过oracle sqlServer mysql

记得informix好像不支持
28 楼 janh 2006-12-30  
我想应该有办法调用hibernate的api来生成sql,再对生成的sql进行修改,加上select count(*) from ... 去掉后面的order,用sql查询返回总数量,不知道有没有人做过。
27 楼 Godlikeme 2006-12-30  
janh 写道
上面不是说了嘛,hibernate的hql不支持这样的查询
select ... from (select ...)
没人看到?所以只有使用楼主一开始说的方法,并不是效率方面的考虑。
hql是这样的,我说的是sql。
26 楼 janh 2006-12-30  
上面不是说了嘛,hibernate的hql不支持这样的查询
select ... from (select ...)
没人看到?所以只有使用楼主一开始说的方法,并不是效率方面的考虑。
25 楼 jianfeng008cn 2006-12-30  
不知道各位用的这一层的dao是封装成什么样子的?有没有朋友可以发上来看看呢。
24 楼 danielkwo 2006-12-30  
1> oracle 8i 以前的版本就不支持在子查询中使用order by。
2> select count(*) from table_a 和 select count(*) from table_a order by field_c 或者 select count(*) from (select * from xxx ) 性能上的差距有的时候会达到几十或者上百的数量级。随着数据量,索引字段,数据的分布,服务器的配置有很大的不同,简单的试验不具有代表性

确实count(*)怎么算出来是很难一下子搞清楚的,比如说使用了union等集合操作,那么就不能简单地删除from前面的子句。(不过HQL 好像不支持union)
23 楼 jianfeng008cn 2006-12-30  
可是就我现在看到的好几个封装都是像我帖的这样的(springside,feling的一个帖子里的(http://www.iteye.com/topic/14657),俺们公司用的。。。),我怀疑是不是有些道理在里面,所以希望有达人指点下呀,这个东西应该是每个项目很基础的东西,不知道怎么回事回答的人却没有:(
22 楼 Godlikeme 2006-12-29  
后来证实了一些想法,lz说的嵌套子查询的效率是没有问题的,40w条数据两种查询方式的差距在0.01s以内。

如果按照我所说,干掉group by这样的汇总条件,是会导致结果集数量变化的。所以只能干掉order by,而保留group by.
保留group by 必须保持原有select .....from .. where .. group by...。
所以为了解决这个问题,只有使用select count(*) from (select ... from .. where.. )才是正道。

我从一开始就没有完全理解lz的意思,多包含。
21 楼 janh 2006-12-29  
关键他修改的是hql的查询语句,而不是sql的查询,hql是不支持象
select ... from (select ...)

这样的子查询的,hql好象只能在where条件中使用子查询.
20 楼 XMLDB 2006-12-29  
无论怎么看,只要是没有做SQL语法解析的,都可能出问题,还得找ajoo的JRC,look:http://www.iteye.com/topic/21903
19 楼 jianfeng008cn 2006-12-29  
ls的兄弟,还有数据库不支持这样的子查询?能否举个例子呀,我现在就用过oracle sqlServer mysql
18 楼 yb31 2006-12-29  
Readonly 写道
这个方法的左右是把from前面的东东移除掉
select u.name, u.id from User u where blahblah...
就变成了select count(*) from User u where blahblah...

不过这个写法貌似有问题啊, 应该是用indexOf(" from "),否则如果有这样的语句select u.fromDate ... 这种语句就出bug了。


不愧是readonly.一眼就看出来了.

select count (*) from (select ...)  

主要应该是性能的考虑。这影响应该挺大的
还有并不是每种数据库都支持这种子查询的
17 楼 jianfeng008cn 2006-12-29  
sprite 写道
我同意Godlikeme 的观点:是因为没必要嵌套一个返回大量查询数据的子查询,效率比较低。


是不是在效率之外还有别的原因呢?
效率的影响这里我觉得应该不大哦,达人指点下哦
16 楼 Readonly 2006-12-29  
jianfeng008cn 写道
ls的朋友,你说的很有道理,只是我最想知道的是
select u.name, u.id from User u where blahblah

计算该hql的总记录数的时候,为什么需要在removeOrders 后还需要 removeSelect 直接这样不可以吗?
select count(*) from (select u.name, u.id from User u where blahblah) 

这样也就不存在group by 引发的问题了。

出于性能考虑吧
15 楼 sprite 2006-12-29  
我同意Godlikeme 的观点:是因为没必要嵌套一个返回大量查询数据的子查询,效率比较低。
14 楼 jianfeng008cn 2006-12-29  
ls的朋友,你说的很有道理,只是我最想知道的是
select u.name, u.id from User u where blahblah

计算该hql的总记录数的时候,为什么需要在removeOrders 后还需要 removeSelect 直接这样不可以吗?
select count(*) from (select u.name, u.id from User u where blahblah) 

这样也就不存在group by 引发的问题了。

相关推荐

Global site tag (gtag.js) - Google Analytics