`

springside学习中遇到的问题

    博客分类:
  • Java
阅读更多
本想发在新手版上,又怕没人回答,麻烦指点后再帮我投新手贴,谢谢。
学习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的官方文档(学习要塌实 ),不过到现在还没有兄弟秀一个好的解决方法出来哦
分享到:
评论
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(*),部分
32 楼 yueyemaitian 2007-02-02  
native sql里边都不能执行count(*)的。
31 楼 yueyemaitian 2007-02-02  
我也遇到了了这个问题,有没有谁有解决的办法呀?
30 楼 smilelee74 2007-01-22  
这种count(*)有问题,就是distinct不能使用。一旦碰到需要distinct的地方就会出错,例如页面上是2条但总记录数却显示成4条。
各位兄弟有没解决问题的办法啊?
29 楼 yb31 2006-12-31  
jianfeng008cn 写道
ls的兄弟,还有数据库不支持这样的子查询?能否举个例子呀,我现在就用过oracle sqlServer mysql

记得informix好像不支持
28 楼 janh 2006-12-30  
我想应该有办法调用hibernate的api来生成sql,再对生成的sql进行修改,加上select count(*) from ... 去掉后面的order,用sql查询返回总数量,不知道有没有人做过。
27 楼 Godlikeme 2006-12-30  
janh 写道
上面不是说了嘛,hibernate的hql不支持这样的查询
select ... from (select ...)
没人看到?所以只有使用楼主一开始说的方法,并不是效率方面的考虑。
hql是这样的,我说的是sql。
26 楼 janh 2006-12-30  
上面不是说了嘛,hibernate的hql不支持这样的查询
select ... from (select ...)
没人看到?所以只有使用楼主一开始说的方法,并不是效率方面的考虑。
25 楼 jianfeng008cn 2006-12-30  
不知道各位用的这一层的dao是封装成什么样子的?有没有朋友可以发上来看看呢。
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)
23 楼 jianfeng008cn 2006-12-30  
可是就我现在看到的好几个封装都是像我帖的这样的(springside,feling的一个帖子里的(http://www.iteye.com/topic/14657),俺们公司用的。。。),我怀疑是不是有些道理在里面,所以希望有达人指点下呀,这个东西应该是每个项目很基础的东西,不知道怎么回事回答的人却没有:(
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的意思,多包含。
21 楼 janh 2006-12-29  
关键他修改的是hql的查询语句,而不是sql的查询,hql是不支持象
select ... from (select ...)

这样的子查询的,hql好象只能在where条件中使用子查询.
20 楼 XMLDB 2006-12-29  
无论怎么看,只要是没有做SQL语法解析的,都可能出问题,还得找ajoo的JRC,look:http://www.iteye.com/topic/21903
19 楼 jianfeng008cn 2006-12-29  
ls的兄弟,还有数据库不支持这样的子查询?能否举个例子呀,我现在就用过oracle sqlServer mysql
18 楼 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了。


不愧是readonly.一眼就看出来了.

select count (*) from (select ...)  

主要应该是性能的考虑。这影响应该挺大的
还有并不是每种数据库都支持这种子查询的
17 楼 jianfeng008cn 2006-12-29  
sprite 写道
我同意Godlikeme 的观点:是因为没必要嵌套一个返回大量查询数据的子查询,效率比较低。


是不是在效率之外还有别的原因呢?
效率的影响这里我觉得应该不大哦,达人指点下哦
16 楼 Readonly 2006-12-29  
jianfeng008cn 写道
ls的朋友,你说的很有道理,只是我最想知道的是
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 引发的问题了。

出于性能考虑吧
15 楼 sprite 2006-12-29  
我同意Godlikeme 的观点:是因为没必要嵌套一个返回大量查询数据的子查询,效率比较低。
14 楼 jianfeng008cn 2006-12-29  
ls的朋友,你说的很有道理,只是我最想知道的是
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 引发的问题了。

相关推荐

    Springside4 学习整理

    【Springside4 学习整理】 Springside4 是一个基于 JavaEE 平台的开源项目,它围绕 Spring Framework 构建,旨在提供实用的示例和最佳实践。Springside4 不是一个完整的框架,而是一个架构示例,帮助开发者理解和...

    springside的jar包

    10. **社区支持**:作为一个活跃的开源项目,Springside拥有一个热心的开发者社区,可以在遇到问题时获得帮助和解答。 使用"springside4-4.1.0.GA"的jar包,开发者可以快速搭建一个基于Spring的项目骨架,然后根据...

    maven+springside 开发入门

    【标题】"maven+springside 开发入门"涉及的主要知识点是 Maven 和 Springside 这两个关键的Java开发工具。...同时,遇到问题时,查阅官方文档、参与社区讨论和阅读相关博客文章都能加速你的学习进度。

    springside

    描述中提到,这个项目受到关注的原因是它有人持续维护,这意味着社区活跃,能够及时解决开发者在使用过程中遇到的问题,同时其架构设计规范,适合构建企业级应用。 Springside项目的核心特点包括: 1. **Spring ...

    SpringSid_Reference使用帮助

    最后,文档提供了详尽的API参考和故障排除指南,帮助开发者在遇到问题时能够快速定位并解决问题。 总的来说,《SpringSide Reference》是一份全面且实用的参考资料,对于想要深入理解和使用SpringSide的开发者来说...

    yandong-程序

    在实践中,你可能会遇到诸如配置管理、服务注册与发现、数据库集成、安全控制、日志记录、单元测试等方面的问题。例如,Spring Security是Spring提供的强大且高度可定制的身份验证和授权框架,用于保护应用程序免受...

    CXF入门.rar

    Apache CXF入门范例以及对传递ListMap类型的疑惑】中,可能会详细解释如何创建和调用一个使用CXF的Web服务,同时也可能讨论了在处理复杂数据类型如List, Object&gt;&gt;时遇到的问题和解决方案。通常,CXF允许你通过JAXB或...

    程序员简历模板.docx

    这表明候选人不仅掌握基本的Java应用部署,还能在遇到问题时迅速定位并解决。 2. **Linux/Unix基础**:对于操作系统,简历显示了对Linux/Unix的基本了解,包括使用基本命令。具备Linux经验可以证明候选人适应不同...

    springsite document

    在“springside3”这个压缩包中,可能包含了SpringSite的源码、示例项目和详细的使用文档。开发者可以通过阅读文档,了解SpringSite的安装步骤、配置方法、常见问题及其解决办法。 10. **社区支持** SpringSite...

    Java EE课程设计报告.doc

    最后,报告总结体会部分要求学生反思整个设计过程,分析遇到的问题、解决策略以及个人的成长和收获,这有助于自我评估和持续学习。参考文献部分则列出了在设计过程中参考的相关资料和技术文档,体现学生对知识来源的...

    Maven2指导手册

    **Maven2 指南** Maven2 是一个强大的构建工具,专为Java项目设计,旨在简化构建过程,统一项目配置。...对于初次接触Maven2的开发者,可能会遇到一定的学习曲线,但一旦掌握,将极大地提升工作效率。

    一种Java快速开发框架的设计和实现.docx

    MiniFramework提供了一套详细的FAQ,帮助开发者解决在使用过程中遇到的问题。此外,开发者还可以参考其他类似框架,如Ruby on Rails,以更好地理解和应用MiniFramework。 6. **应用场景** MiniFramework适用于...

Global site tag (gtag.js) - Google Analytics