All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cn.dreampie.orm.dialect.MSSQLDialect Maven / Gradle / Ivy

There is a newer version: 1.3.0.RELEASE
Show newest version
package cn.dreampie.orm.dialect;

import java.util.regex.Matcher;

/**
 * Created by ice on 15-1-12.
 */
public class MSSQLDialect extends DefaultDialect {

  public String getDbType() {
    return "mssql";
  }

  public String validQuery() {
    return "select 1";
  }

  public String driverClass() {
    return "com.microsoft.sqlserver.jdbc.SQLServerDriver";
  }

  public String paginateWith(int pageNumber, int pageSize, String sql) {
    if (pageNumber == 1 && pageSize == 1) {
      //如果sql本身只返回一个结果
      if (selectSinglePattern.matcher(sql).find()) {
        return sql;
      }
    }

    int offset = pageSize * (pageNumber - 1);

    String orderBys = null;
    Matcher om = orderPattern.matcher(sql);
    if (om.find()) {
      int oindex = om.end();
      if (oindex > sql.lastIndexOf(")")) {
        orderBys = sql.substring(oindex, sql.length());
        sql = sql.substring(0, om.start());
      }
    }

    //mssql ROW_NUMBER分页必须要至少一个ORDER BY
    if (orderBys == null) {
      orderBys = "CURRENT_TIMESTAMP";
      //throw new DBException("MSSQL offset queries require an order by column.");
    }

    StringBuilder querySql = new StringBuilder();
    querySql.append("SELECT paginate_alias.* FROM (SELECT ROW_NUMBER() OVER (ORDER BY ");
    querySql.append(orderBys);
    querySql.append(") rownumber,");

    Matcher sm = selectPattern.matcher(sql);
    if (sm.find()) {
      querySql.append(' ').append(sql.substring(sm.end()));
    } else {
      querySql.append(sql);
    }

    // T-SQL offset starts with 1, not like MySQL with 0;
    querySql.append(") paginate_alias WHERE rownumber BETWEEN ").append(offset + 1)
        .append(" AND ").append(pageSize + offset);

    return querySql.toString();
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy