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

  

posted @ 2022-04-07 14:12  小小菜包子  阅读(54)  评论(0)    收藏  举报