首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

springside学习中遇到的有关问题

2012-11-08 
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(*),部分

热点排行