zoukankan      html  css  js  c++  java
  • mybatis-paginator对SqlServer分页实现

    package com.github.miemiedev.mybatis.paginator.dialect;
    
    import com.github.miemiedev.mybatis.paginator.domain.PageBounds;
    import org.apache.ibatis.mapping.MappedStatement;
    
    /**
     *
     * @author badqiu
     * @author miemiedev
     */
    // Hibernate BUG: http://opensource.atlassian.com/projects/hibernate/browse/HHH-2655
    // TODO 完善并测试SQLServer2005Dialect
    public class SQLServer2005Dialect extends Dialect{
    
        public SQLServer2005Dialect(MappedStatement mappedStatement, Object parameterObject, PageBounds pageBounds) {
            super(mappedStatement, parameterObject, pageBounds);
        }
    
    
        /**
    	 * Add a LIMIT clause to the given SQL SELECT
    	 *
    	 * The LIMIT SQL will look like:
    	 *
    	 * WITH query AS
    	 *      (SELECT TOP 100 percent ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as __row_number__, * from table_name)
    	 * SELECT *
    	 * FROM query
    	 * WHERE __row_number__ BETWEEN :offset and :lastRows
    	 * ORDER BY __row_number__
    	 * 
    	 * @param sql The SQL statement to base the limit query off of.
    	 * @param offset         Offset of the first row to be returned by the query (zero-based)
    	 * @param limit           Maximum number of rows to be returned by the query
    	 * @return A new SQL statement with the LIMIT clause applied.
    	 */
        protected String getLimitString(String sql, String offsetName,int offset, String limitName, int limit) {
    		StringBuffer pagingBuilder = new StringBuffer();
    		String orderby = getOrderByPart(sql);
    		String distinctStr = "";
    
    		String loweredString = sql.toLowerCase();
    		String sqlPartString = sql;
    		if (loweredString.trim().startsWith("select")) {
    			int index = 6;
    			if (loweredString.startsWith("select distinct")) {
    				distinctStr = "DISTINCT ";
    				index = 15;
    			}
    			sqlPartString = sqlPartString.substring(index);
    		}
    		pagingBuilder.append(sqlPartString);
    
    		// if no ORDER BY is specified use fake ORDER BY field to avoid errors
    		if (orderby == null || orderby.length() == 0) {
    			orderby = "ORDER BY CURRENT_TIMESTAMP";
    		}
    
    		StringBuffer result = new StringBuffer();
    		result.append("WITH query AS (SELECT ")
    				.append(distinctStr)
    				.append("TOP 100 PERCENT ")
    				.append(" ROW_NUMBER() OVER (")
    				.append(orderby)
    				.append(") as __row_number__, ")
    				.append(pagingBuilder)
    				.append(") SELECT * FROM query WHERE __row_number__ > ? AND __row_number__ <= ?")
    				.append(" ORDER BY __row_number__");
            setPageParameter(offsetName,offset,Integer.class);
            setPageParameter("__offsetEnd",offset+limit,Integer.class);
    		return result.toString();
    	}
    
    	static String getOrderByPart(String sql) {
    		String loweredString = sql.toLowerCase();
    		int orderByIndex = loweredString.indexOf("order by");
    		if (orderByIndex != -1) {
    			// if we find a new "order by" then we need to ignore
    			// the previous one since it was probably used for a subquery
    			return sql.substring(orderByIndex);
    		} else {
    			return "";
    		}
    	}
    }
    

      

  • 相关阅读:
    《区块链100问》第51集:区块链资产有匿名性
    《区块链100问》第52集:区块链资产能去中心化记账
    《区块链100问》第53集:区块链资产不可复制
    day 5 模块导入、常用模块os shutil sys commands subprocess hashlib json pickle zipfile traceback random datetime pathlib
    apache中配置php支持模块模式、cgi模式和fastcgi模式的实验
    day3--集合、文件操作、字符编码与转换、函数(递归,lambda,filter,map)、字典排序
    练习题目 :if for while else range、xrange、zip
    解决mySQL占用内存超大问题
    my.cnf重要配置参数说明
    chattr与lsattr命令详解
  • 原文地址:https://www.cnblogs.com/firstdream/p/7823033.html
Copyright © 2011-2022 走看看