|
锁定老贴子 主题:springside学习中遇到的问题
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2006-12-30 关键字: hibernate
本想发在新手版上,又怕没人回答,麻烦指点后再帮我投新手贴,谢谢。
学习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的官方文档(学习要塌实 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间: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 ...) 是因为没必要嵌套一个返回大量查询数据的子查询,效率比较低。 |
|
| 返回顶楼 | |






