由于项目开发中遇到order by排序有相同的值,导致分页数据总查询出第一页的数据,查了些资料说是要在order by条件后面再加入rowid可以解决这个问题;项目又要兼容多种数据库,所以只能在java中拦截和修改oralce查询语句中order by动态拼接的语句,搞了几小时终于弄好了,基本耗在正则表达式上了,做一下记录
//将sql转小写,方便正则匹配
String strings = sql.toLowerCase();
//order by 正则表达式(适用order by各种排序条件)
String regexp = "order\\s{1,}by\\s{1,}([a-zA-Z0-9_]{1,}(\\sasc|\\sdesc)?\\s{0,},\\s{0,})*[a-zA-Z0-9_]{1,}(\\s{1,}asc|\\s{1,}desc)?";
//替换sql中多个空格
strings = strings.replaceAll("\\s{1,}", " ");
//创建一个匹配模式
Pattern r = Pattern.compile(regexp);
//匹配客串
Matcher m = r.matcher(strings);
while (m.find()) {
//替换order by条件,加入rowid排序
strings = strings.replaceAll(m.group(0), m.group(0)+",rowid ");
}
//重新拼接新的sql
pagingSelect.append(strings);