`

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的官方文档(学习要塌实 ),不过到现在还没有兄弟秀一个好的解决方法出来哦
分享到:
评论
13 楼 Readonly 2006-12-29  
这个方法的左右是把from前面的东东移除掉
select u.name, u.id from User u where blahblah...
就变成了select count(*) from User u where blahblah...

不过这个写法貌似有问题啊, 应该是用indexOf(" from "),否则如果有这样的语句select u.fromDate ... 这种语句就出bug了。
12 楼 jianfeng008cn 2006-12-29  
sprite 写道
我觉得你应该去看一下它的removeSelect()方法的代码,仔细理解一下.
要不你就把removeSelect()方法的代码贴出来,大家一起讨论一下.


	/**
	 * 去除hql的select 子句,未考虑union的情况,,用于pagedQuery.
	 */
	private static String removeSelect(String hql) {
		Assert.hasText(hql);
		int beginPos = hql.toLowerCase().indexOf("from");
		Assert.isTrue(beginPos != -1, " hql : " + hql + " must has a keyword 'from'");
		return hql.substring(beginPos);
	}


代码如上,该“如何理解”呢?
11 楼 sprite 2006-12-29  
我觉得你应该去看一下它的removeSelect()方法的代码,仔细理解一下.
要不你就把removeSelect()方法的代码贴出来,大家一起讨论一下.
10 楼 jianfeng008cn 2006-12-29  
Godlikeme 写道
嗯,这个比较明白,那就是返回记录数的sql写法问题。
没有看过源代码,但是猜测,removeOrders()应该把 order by ,group by 这些零碎都干掉了。
为什么前面不要写select count(*) from (select ...)
是因为没必要嵌套一个返回大量查询数据的子查询,效率比较低。


private static String removeOrders(String hql) {
		Assert.hasText(hql);
		Pattern p = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*", Pattern.CASE_INSENSITIVE);
		Matcher m = p.matcher(hql);
		StringBuffer sb = new StringBuffer();
		while (m.find()) {
			m.appendReplacement(sb, "");
		}
		m.appendTail(sb);
		return sb.toString();
	}


removeOrders()应该把 order by ,group by 这些零碎都干掉了。
不是这样的,很多人都写过这样的封装的,就是没人回答一下,梗着骨头真不爽啊。
9 楼 Godlikeme 2006-12-29  
嗯,这个比较明白,那就是返回记录数的sql写法问题。
没有看过源代码,但是猜测,removeOrders()应该把 order by ,group by 这些零碎都干掉了。
为什么前面不要写select count(*) from (select ...)
是因为没必要嵌套一个返回大量查询数据的子查询,效率比较低。
8 楼 jianfeng008cn 2006-12-29  
ls的兄弟,我的意思是
String countQueryString = " select count (*) " + removeSelect(removeOrders(hql));
   
这句不是

String countQueryString = " select count (*)  from (" + removeOrders(hql) + ")";   


这样就可以了吗,为什么我看到的很多的查询都是我贴出来的那样的呢?这其中的原因我不知道,
你说的select count(*) from (select count(*) from ...) 这样的情况不符合这个东西的实际使用场景。

我的意思你了解了吗,希望有人指点下哦!
7 楼 Godlikeme 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

不是啦,这个大家都知道的东东。是不知道你最开始想问什么?
6 楼 jianfeng008cn 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
5 楼 Godlikeme 2006-12-29  
jianfeng008cn 写道
Godlikeme 写道
我猜哦,removeSelect(removeOrders(hql)),是把hql语句中,(select .... ) from... where...(order by ...),()里的这两端干掉。生成一个select count(*) from ...., 就是查询所有记录数的语句。拿所有记录数到后面分页函数中用。


你的意思我理解,但是如果order by前面还有group by 这样是不行的,所以我觉得这个问题也是有点意思的
不知道你再问什么了!
4 楼 jianfeng008cn 2006-12-29  
Godlikeme 写道
我猜哦,removeSelect(removeOrders(hql)),是把hql语句中,(select .... ) from... where...(order by ...),()里的这两端干掉。生成一个select count(*) from ...., 就是查询所有记录数的语句。拿所有记录数到后面分页函数中用。


你的意思我理解,但是如果order by前面还有group by 这样是不行的,所以我觉得这个问题也是有点意思的
3 楼 jianfeng008cn 2006-12-29  
sprite 写道
如果你的sql本身就是:select count(*) from..
那再用select count(*)得到的答案是不是1呢(而不是你想要的 如10条记录)?!


用了这个方法的时候传近来的hql不会是select count(*) from 这样的情况的哦。
前面俺没说清楚,麻烦再给指点下哦。
2 楼 Godlikeme 2006-12-29  
我猜哦,removeSelect(removeOrders(hql)),是把hql语句中,(select .... ) from... where...(order by ...),()里的这两端干掉。生成一个select count(*) from ...., 就是查询所有记录数的语句。拿所有记录数到后面分页函数中用。
1 楼 sprite 2006-12-29  
如果你的sql本身就是:select count(*) from..
那再用select count(*)得到的答案是不是1呢(而不是你想要的 如10条记录)?!

相关推荐

    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