锁定老帖子 主题:springside学习中遇到的问题
精华帖 (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的官方文档(学习要塌实 ),不过到现在还没有兄弟秀一个好的解决方法出来哦 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-12-29
如果你的sql本身就是:select count(*) from..
那再用select count(*)得到的答案是不是1呢(而不是你想要的 如10条记录)?! |
|
返回顶楼 | |
发表时间:2006-12-29
我猜哦,removeSelect(removeOrders(hql)),是把hql语句中,(select .... ) from... where...(order by ...),()里的这两端干掉。生成一个select count(*) from ...., 就是查询所有记录数的语句。拿所有记录数到后面分页函数中用。
|
|
返回顶楼 | |
发表时间:2006-12-29
sprite 写道 如果你的sql本身就是:select count(*) from..
那再用select count(*)得到的答案是不是1呢(而不是你想要的 如10条记录)?! 用了这个方法的时候传近来的hql不会是select count(*) from 这样的情况的哦。 前面俺没说清楚,麻烦再给指点下哦。 |
|
返回顶楼 | |
发表时间:2006-12-29
Godlikeme 写道 我猜哦,removeSelect(removeOrders(hql)),是把hql语句中,(select .... ) from... where...(order by ...),()里的这两端干掉。生成一个select count(*) from ...., 就是查询所有记录数的语句。拿所有记录数到后面分页函数中用。
你的意思我理解,但是如果order by前面还有group by 这样是不行的,所以我觉得这个问题也是有点意思的 |
|
返回顶楼 | |
发表时间:2006-12-29
jianfeng008cn 写道 Godlikeme 写道 我猜哦,removeSelect(removeOrders(hql)),是把hql语句中,(select .... ) from... where...(order by ...),()里的这两端干掉。生成一个select count(*) from ...., 就是查询所有记录数的语句。拿所有记录数到后面分页函数中用。
你的意思我理解,但是如果order by前面还有group by 这样是不行的,所以我觉得这个问题也是有点意思的 |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间: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 不是啦,这个大家都知道的东东。是不知道你最开始想问什么? |
|
返回顶楼 | |
发表时间:2006-12-29
ls的兄弟,我的意思是
String countQueryString = " select count (*) " + removeSelect(removeOrders(hql)); 这句不是 String countQueryString = " select count (*) from (" + removeOrders(hql) + ")"; 这样就可以了吗,为什么我看到的很多的查询都是我贴出来的那样的呢?这其中的原因我不知道, 你说的select count(*) from (select count(*) from ...) 这样的情况不符合这个东西的实际使用场景。 我的意思你了解了吗,希望有人指点下哦! |
|
返回顶楼 | |
发表时间:2006-12-29
嗯,这个比较明白,那就是返回记录数的sql写法问题。
没有看过源代码,但是猜测,removeOrders()应该把 order by ,group by 这些零碎都干掉了。 为什么前面不要写select count(*) from (select ...) 是因为没必要嵌套一个返回大量查询数据的子查询,效率比较低。 |
|
返回顶楼 | |