/**
* 根据数据库方言,生成特定的分页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;
}
}