根据数据库方言,生成特定的分页sql
/** * 根据数据库方言,生成特定的分页sql * * @param sql * @param sql,map,dialect * @return */ private String generatePageSql(String sql, Map map, String dialect) { if (notEmpty(dialect)) { StringBuffer pageSql = new StringBuffer(); int start; int end; if (map.get("start") instanceof Integer) { start = (Integer) map.get("start"); } else { start = Integer.parseInt((String)map.get("start")); } if (map.get("limit") instanceof Integer) { end = (Integer) map.get("limit"); } else { end = Integer.parseInt((String)map.get("limit")); } if ("mysql".equals(dialect)) { pageSql.append(sql); pageSql.append(" limit " + start + "," + end); } else if ("oracle".equals(dialect)) { pageSql.append("SELECT * FROM (SELECT TMP_TB.*,ROWNUM ROW_ID FROM ("); pageSql.append(sql); // 解决Oracle分页查询排序重复问题 if (sql.toUpperCase().indexOf("ORDER BY") == -1) { // 若SQL中不包含ORDER BY,则强制增加一个排序 // 若SQl包含ORDER BY,但排序条件不唯一,也有可能造成查询重复问题,这种情况需要项目自己添加唯一排序条件解决 pageSql.append(" ORDER BY ROWNUM ASC"); } pageSql.append(") TMP_TB WHERE ROWNUM<="); pageSql.append(start + end); pageSql.append(") WHERE ROW_ID>="); pageSql.append(start + 1); } else if ("db2".equals(dialect)) { pageSql.append("SELECT * FROM ( SELECT B.*, ROWNUMBER() OVER() AS RN FROM ( "); pageSql.append(sql); pageSql.append(" ) AS B ) AS A "); pageSql.append(" WHERE A.RN BETWEEN " + (start + 1) + " AND " + (start + end) + " "); } else if ("sqlserver".equals(dialect)) { sql = sql.toUpperCase(); String tableName = ""; int fIdx = sql.lastIndexOf("FROM") + 4; int wIdx = sql.lastIndexOf("WHERE"); if(wIdx!=-1){ tableName = sql.substring(fIdx, wIdx).trim(); }else{ tableName = sql.substring(fIdx).trim(); } // 获取table主键字段名称 String pk = "select name from sysobjects where parent_obj=object_id('" + tableName + "') and xtype='PK'"; // sqlserver分页查询使用ROW_NUMBER()函数需要结合OVER()中的ORDER BY语句 pageSql.append("SELECT * FROM ( SELECT B.*, ROW_NUMBER() OVER(ORDER BY ("); pageSql.append(pk); pageSql.append(")) AS RN FROM ( "); pageSql.append(sql); pageSql.append(" ) AS B ) AS A "); pageSql.append(" WHERE A.RN BETWEEN " + (start + 1) + " AND " + (start + end) + " "); } else if ("hana".equals(dialect)) { pageSql.append("SELECT * FROM ( SELECT B.*, ROW_NUMBER() OVER() AS RN FROM ( "); pageSql.append(sql); pageSql.append(" ) AS B ) AS A "); pageSql.append(" WHERE A.RN BETWEEN " + (start + 1) + " AND " + (start + end) + " "); } return pageSql.toString(); } else { return sql; } }