锁定老帖子 主题:springside学习中遇到的问题
精华帖 (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 这些零碎都干掉了。不是这样的,很多人都写过这样的封装的,就是没人回答一下,梗着骨头真不爽啊。 |
|
返回顶楼 | |
发表时间:2006-12-29
我觉得你应该去看一下它的removeSelect()方法的代码,仔细理解一下.
要不你就把removeSelect()方法的代码贴出来,大家一起讨论一下. |
|
返回顶楼 | |
发表时间: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); } 代码如上,该“如何理解”呢? |
|
返回顶楼 | |
发表时间: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了。 |
|
返回顶楼 | |
发表时间: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 引发的问题了。 |
|
返回顶楼 | |
发表时间:2006-12-29
我同意Godlikeme 的观点:是因为没必要嵌套一个返回大量查询数据的子查询,效率比较低。
|
|
返回顶楼 | |
发表时间: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 引发的问题了。 出于性能考虑吧 |
|
返回顶楼 | |
发表时间:2006-12-29
sprite 写道 我同意Godlikeme 的观点:是因为没必要嵌套一个返回大量查询数据的子查询,效率比较低。
是不是在效率之外还有别的原因呢? 效率的影响这里我觉得应该不大哦,达人指点下哦 |
|
返回顶楼 | |
发表时间: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 ...) 主要应该是性能的考虑。这影响应该挺大的 还有并不是每种数据库都支持这种子查询的 |
|
返回顶楼 | |
发表时间:2006-12-29
ls的兄弟,还有数据库不支持这样的子查询?能否举个例子呀,我现在就用过oracle sqlServer mysql
|
|
返回顶楼 | |