springside学习中遇到的问题本想发在新手版上,又怕没人回答,麻烦指点后再帮我投新手贴,谢谢。学习springsid
springside学习中遇到的问题
本想发在新手版上,又怕没人回答,麻烦指点后再帮我投新手贴,谢谢。
学习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的官方文档(学习要塌实

),不过到现在还没有兄弟秀一个好的解决方法出来哦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 引发的问题了。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 引发的问题了。
出于性能考虑吧

不愧是readonly.一眼就看出来了.
select count (*) from (select ...)
主要应该是性能的考虑。这影响应该挺大的
还有并不是每种数据库都支持这种子查询的select ... from (select ...)
这样的子查询的,hql好象只能在where条件中使用子查询. 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的意思,多包含。 23 楼 jianfeng008cn 2006-12-30 可是就我现在看到的好几个封装都是像我帖的这样的(springside,feling的一个帖子里的(http://www.iteye.com/topic/14657),俺们公司用的。。。),我怀疑是不是有些道理在里面,所以希望有达人指点下呀,这个东西应该是每个项目很基础的东西,不知道怎么回事回答的人却没有:( 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) 25 楼 jianfeng008cn 2006-12-30 不知道各位用的这一层的dao是封装成什么样子的?有没有朋友可以发上来看看呢。 26 楼 janh 2006-12-30 上面不是说了嘛,hibernate的hql不支持这样的查询
select ... from (select ...)
没人看到?所以只有使用楼主一开始说的方法,并不是效率方面的考虑。 27 楼 Godlikeme 2006-12-30 janh 写道上面不是说了嘛,hibernate的hql不支持这样的查询
select ... from (select ...)
没人看到?所以只有使用楼主一开始说的方法,并不是效率方面的考虑。hql是这样的,我说的是sql。
28 楼 janh 2006-12-30 我想应该有办法调用hibernate的api来生成sql,再对生成的sql进行修改,加上select count(*) from ... 去掉后面的order,用sql查询返回总数量,不知道有没有人做过。 29 楼 yb31 2006-12-31 jianfeng008cn 写道ls的兄弟,还有数据库不支持这样的子查询?能否举个例子呀,我现在就用过oracle sqlServer mysql
记得informix好像不支持 30 楼 smilelee74 2007-01-22 这种count(*)有问题,就是distinct不能使用。一旦碰到需要distinct的地方就会出错,例如页面上是2条但总记录数却显示成4条。
各位兄弟有没解决问题的办法啊?
31 楼 yueyemaitian 2007-02-02 我也遇到了了这个问题,有没有谁有解决的办法呀? 32 楼 yueyemaitian 2007-02-02 native sql里边都不能执行count(*)的。 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(*),部分