论坛首页 Java企业应用论坛

springside学习中遇到的问题

浏览 18202 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间: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 这些零碎都干掉了。
不是这样的,很多人都写过这样的封装的,就是没人回答一下,梗着骨头真不爽啊。
0 请登录后投票
   发表时间:2006-12-29  
我觉得你应该去看一下它的removeSelect()方法的代码,仔细理解一下.
要不你就把removeSelect()方法的代码贴出来,大家一起讨论一下.
0 请登录后投票
   发表时间: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);
	}


代码如上,该“如何理解”呢?
0 请登录后投票
   发表时间: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了。
0 请登录后投票
   发表时间: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 引发的问题了。
0 请登录后投票
   发表时间:2006-12-29  
我同意Godlikeme 的观点:是因为没必要嵌套一个返回大量查询数据的子查询,效率比较低。
0 请登录后投票
   发表时间: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 引发的问题了。

出于性能考虑吧
0 请登录后投票
   发表时间:2006-12-29  
sprite 写道
我同意Godlikeme 的观点:是因为没必要嵌套一个返回大量查询数据的子查询,效率比较低。


是不是在效率之外还有别的原因呢?
效率的影响这里我觉得应该不大哦,达人指点下哦
0 请登录后投票
   发表时间: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 ...)  

主要应该是性能的考虑。这影响应该挺大的
还有并不是每种数据库都支持这种子查询的
0 请登录后投票
   发表时间:2006-12-29  
ls的兄弟,还有数据库不支持这样的子查询?能否举个例子呀,我现在就用过oracle sqlServer mysql
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics