论坛首页 Java企业应用论坛

springside学习中遇到的问题

浏览 18201 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-12-29  
本想发在新手版上,又怕没人回答,麻烦指点后再帮我投新手贴,谢谢。
学习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的官方文档(学习要塌实 ),不过到现在还没有兄弟秀一个好的解决方法出来哦
   发表时间:2006-12-29  
如果你的sql本身就是:select count(*) from..
那再用select count(*)得到的答案是不是1呢(而不是你想要的 如10条记录)?!
0 请登录后投票
   发表时间:2006-12-29  
我猜哦,removeSelect(removeOrders(hql)),是把hql语句中,(select .... ) from... where...(order by ...),()里的这两端干掉。生成一个select count(*) from ...., 就是查询所有记录数的语句。拿所有记录数到后面分页函数中用。
0 请登录后投票
   发表时间:2006-12-29  
sprite 写道
如果你的sql本身就是:select count(*) from..
那再用select count(*)得到的答案是不是1呢(而不是你想要的 如10条记录)?!


用了这个方法的时候传近来的hql不会是select count(*) from 这样的情况的哦。
前面俺没说清楚,麻烦再给指点下哦。
0 请登录后投票
   发表时间:2006-12-29  
Godlikeme 写道
我猜哦,removeSelect(removeOrders(hql)),是把hql语句中,(select .... ) from... where...(order by ...),()里的这两端干掉。生成一个select count(*) from ...., 就是查询所有记录数的语句。拿所有记录数到后面分页函数中用。


你的意思我理解,但是如果order by前面还有group by 这样是不行的,所以我觉得这个问题也是有点意思的
0 请登录后投票
   发表时间:2006-12-29  
jianfeng008cn 写道
Godlikeme 写道
我猜哦,removeSelect(removeOrders(hql)),是把hql语句中,(select .... ) from... where...(order by ...),()里的这两端干掉。生成一个select count(*) from ...., 就是查询所有记录数的语句。拿所有记录数到后面分页函数中用。


你的意思我理解,但是如果order by前面还有group by 这样是不行的,所以我觉得这个问题也是有点意思的
不知道你再问什么了!
0 请登录后投票
   发表时间:2006-12-29  
Godlikeme 写道
jianfeng008cn 写道
Godlikeme 写道
我猜哦,removeSelect(removeOrders(hql)),是把hql语句中,(select .... ) from... where...(order by ...),()里的这两端干掉。生成一个select count(*) from ...., 就是查询所有记录数的语句。拿所有记录数到后面分页函数中用。


你的意思我理解,但是如果order by前面还有group by 这样是不行的,所以我觉得这个问题也是有点意思的
不知道你再问什么了!


sql中,group by 对跟在select后面的东西有要求的。
有没有知道“我在问什么”的人来回答一下呀?期待ing
0 请登录后投票
   发表时间:2006-12-29  
jianfeng008cn 写道
Godlikeme 写道
jianfeng008cn 写道
Godlikeme 写道
我猜哦,removeSelect(removeOrders(hql)),是把hql语句中,(select .... ) from... where...(order by ...),()里的这两端干掉。生成一个select count(*) from ...., 就是查询所有记录数的语句。拿所有记录数到后面分页函数中用。


你的意思我理解,但是如果order by前面还有group by 这样是不行的,所以我觉得这个问题也是有点意思的
不知道你再问什么了!


sql中,group by 对跟在select后面的东西有要求的。
有没有知道“我在问什么”的人来回答一下呀?期待ing

不是啦,这个大家都知道的东东。是不知道你最开始想问什么?
0 请登录后投票
   发表时间:2006-12-29  
ls的兄弟,我的意思是
String countQueryString = " select count (*) " + removeSelect(removeOrders(hql));
   
这句不是

String countQueryString = " select count (*)  from (" + removeOrders(hql) + ")";   


这样就可以了吗,为什么我看到的很多的查询都是我贴出来的那样的呢?这其中的原因我不知道,
你说的select count(*) from (select count(*) from ...) 这样的情况不符合这个东西的实际使用场景。

我的意思你了解了吗,希望有人指点下哦!
0 请登录后投票
   发表时间:2006-12-29  
嗯,这个比较明白,那就是返回记录数的sql写法问题。
没有看过源代码,但是猜测,removeOrders()应该把 order by ,group by 这些零碎都干掉了。
为什么前面不要写select count(*) from (select ...)
是因为没必要嵌套一个返回大量查询数据的子查询,效率比较低。
0 请登录后投票
论坛首页 Java企业应用版

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