2006-12-29
springside学习中遇到的问题
关键字: hibernate
本想发在新手版上,又怕没人回答,麻烦指点后再帮我投新手贴,谢谢。
学习springside时候遇到个问题,问题如下:
HibernateGenericDao中
中为什么这句
需要先removeSelect?我们的sql不是可以这样的吗
后记:hibernate的设计原理还没看透,没有好好学习一下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的官方文档(学习要塌实
评论
fangang
2007-02-09
Godlikeme 写道
嗯,这个比较明白,那就是返回记录数的sql写法问题。
没有看过源代码,但是猜测,removeOrders()应该把 order by ,group by 这些零碎都干掉了。
为什么前面不要写select count(*) from (select ...)
是因为没必要嵌套一个返回大量查询数据的子查询,效率比较低。
没有看过源代码,但是猜测,removeOrders()应该把 order by ,group by 这些零碎都干掉了。
为什么前面不要写select count(*) from (select ...)
是因为没必要嵌套一个返回大量查询数据的子查询,效率比较低。
赞成Godlikeme的看法,要实现count,如果写成select count(*) from (select ...)效率是比较低的,因为数据库将先完成select ...以后才会执行select count(*),如果数据量大将会占用大量的时间和数据库资源。正确的写法是去掉select部分,加上select count(*),部分
yueyemaitian
2007-02-02
native sql里边都不能执行count(*)的。
yueyemaitian
2007-02-02
我也遇到了了这个问题,有没有谁有解决的办法呀?
smilelee74
2007-01-22
这种count(*)有问题,就是distinct不能使用。一旦碰到需要distinct的地方就会出错,例如页面上是2条但总记录数却显示成4条。
各位兄弟有没解决问题的办法啊?
各位兄弟有没解决问题的办法啊?
yb31
2006-12-31
jianfeng008cn 写道
ls的兄弟,还有数据库不支持这样的子查询?能否举个例子呀,我现在就用过oracle sqlServer mysql
记得informix好像不支持
janh
2006-12-30
我想应该有办法调用hibernate的api来生成sql,再对生成的sql进行修改,加上select count(*) from ... 去掉后面的order,用sql查询返回总数量,不知道有没有人做过。
Godlikeme
2006-12-30
janh 写道
上面不是说了嘛,hibernate的hql不支持这样的查询
select ... from (select ...)
没人看到?所以只有使用楼主一开始说的方法,并不是效率方面的考虑。
hql是这样的,我说的是sql。select ... from (select ...)
没人看到?所以只有使用楼主一开始说的方法,并不是效率方面的考虑。
janh
2006-12-30
上面不是说了嘛,hibernate的hql不支持这样的查询
select ... from (select ...)
没人看到?所以只有使用楼主一开始说的方法,并不是效率方面的考虑。
select ... from (select ...)
没人看到?所以只有使用楼主一开始说的方法,并不是效率方面的考虑。
jianfeng008cn
2006-12-30
不知道各位用的这一层的dao是封装成什么样子的?有没有朋友可以发上来看看呢。
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)
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)
jianfeng008cn
2006-12-30
可是就我现在看到的好几个封装都是像我帖的这样的(springside,feling的一个帖子里的(http://www.javaeye.com/topic/14657),俺们公司用的。。。),我怀疑是不是有些道理在里面,所以希望有达人指点下呀,这个东西应该是每个项目很基础的东西,不知道怎么回事回答的人却没有:(
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的意思,多包含。
如果按照我所说,干掉group by这样的汇总条件,是会导致结果集数量变化的。所以只能干掉order by,而保留group by.
保留group by 必须保持原有select .....from .. where .. group by...。
所以为了解决这个问题,只有使用select count(*) from (select ... from .. where.. )才是正道。
我从一开始就没有完全理解lz的意思,多包含。
janh
2006-12-29
关键他修改的是hql的查询语句,而不是sql的查询,hql是不支持象
这样的子查询的,hql好象只能在where条件中使用子查询.
select ... from (select ...)
这样的子查询的,hql好象只能在where条件中使用子查询.
XMLDB
2006-12-29
无论怎么看,只要是没有做SQL语法解析的,都可能出问题,还得找ajoo的JRC,look:http://www.javaeye.com/topic/21903
jianfeng008cn
2006-12-29
ls的兄弟,还有数据库不支持这样的子查询?能否举个例子呀,我现在就用过oracle sqlServer mysql
yb31
2006-12-29
Readonly 写道
这个方法的左右是把from前面的东东移除掉
select u.name, u.id from User u where blahblah...
就变成了select count(*) from User u where blahblah...
不过这个写法貌似有问题啊, 应该是用indexOf(" from "),否则如果有这样的语句select u.fromDate ... 这种语句就出bug了。
select u.name, u.id from User u where blahblah...
就变成了select count(*) from User u where blahblah...
不过这个写法貌似有问题啊, 应该是用indexOf(" from "),否则如果有这样的语句select u.fromDate ... 这种语句就出bug了。
select count (*) from (select ...)
主要应该是性能的考虑。这影响应该挺大的
还有并不是每种数据库都支持这种子查询的
jianfeng008cn
2006-12-29
sprite 写道
我同意Godlikeme 的观点:是因为没必要嵌套一个返回大量查询数据的子查询,效率比较低。
是不是在效率之外还有别的原因呢?
效率的影响这里我觉得应该不大哦,达人指点下哦
Readonly
2006-12-29
jianfeng008cn 写道
ls的朋友,你说的很有道理,只是我最想知道的是
计算该hql的总记录数的时候,为什么需要在removeOrders 后还需要 removeSelect 直接这样不可以吗?
这样也就不存在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 引发的问题了。
出于性能考虑吧
sprite
2006-12-29
我同意Godlikeme 的观点:是因为没必要嵌套一个返回大量查询数据的子查询,效率比较低。
jianfeng008cn
2006-12-29
ls的朋友,你说的很有道理,只是我最想知道的是
计算该hql的总记录数的时候,为什么需要在removeOrders 后还需要 removeSelect 直接这样不可以吗?
这样也就不存在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 引发的问题了。
- 浏览: 80454 次
- 性别:

- 来自: 湖州

- 详细资料
搜索本博客
我的相册
旋转 SNV10095
共 1 张
共 1 张
最新评论
-
MySQL5安装版windows xp重 ...
可以下载我精简的绿色版 (*^__^*) 嘻嘻…… 其实很简单的
-- by vb2005xu -
【Ext学习二】Extjs2 小 ...
//已添加自动播放功能: Ext.onReady(function() ...
-- by jianfeng008cn -
【Ext学习一】Ext 继承函 ...
fins 写道我说的是第一个问题 不是第二个空函数F的问题 我说了啊, 这些问题 ...
-- by jianfeng008cn -
【Ext学习一】Ext 继承函 ...
我搞错了,可以支持inline constructor的原因是: sb = ov ...
-- by sp42 -
【Ext学习一】Ext 继承函 ...
空函数是经典的闭包应用,用来解决继承的问题了 呵呵, 至于 "spp.cons ...
-- by sp42






评论排行榜