package com.shtao.ext.ibatis.common.util;
import org.apache.log4j.Logger;
public class SqlserverPaginator implements Paginator {
private static Logger log = Logger.getLogger(SqlserverPaginator.class);
/**
* ms Sql 分页代码 SELECT * FROM ( SELECT TOP( pageSize ) * FROM ( SELECT TOP (
* pageSize * pageNo ) col1,col2 FROM Articles ORDER BY PubTime DESC ) ORDER
* BY PubTime ASC ) ORDER BY PubTime DESC 这个方法最后一页的时候会有问题,提出来的数据是最后topN的数据行,
* 而不是剩余的数据行, 可以考虑和count一起使用 不过问题不大
*/
@Override
public String getPaginatedListSql(String sql, int pageNo, int pageSize) {
if (pageNo <= 0 || pageSize <= 0)
return sql;
int selectBeginIndex = sql.toLowerCase().indexOf("select ");
int orderByBeginIndex = sql.toLowerCase().indexOf("order by");
String orderByString = "ORDER BY CURRENT_TIMESTAMP asc";
if (orderByBeginIndex >= 0) {
orderByString = sql.substring(orderByBeginIndex);
}
String orderByStringD = "";
if (orderByString.toLowerCase().indexOf("desc") > 0) {
orderByStringD = orderByString.toLowerCase().replaceAll("desc", "asc");
} else {
orderByStringD = orderByString.toLowerCase().replaceAll("asc", "desc");
}
StringBuffer pageStr = new StringBuffer();
pageStr.append("SELECT * FROM ( SELECT TOP ");
pageStr.append(pageSize);
pageStr.append(" * FROM ( SELECT TOP ");
pageStr.append(pageSize * pageNo);
pageStr.append(" ");
if (orderByBeginIndex >= 0) {
pageStr.append(sql.substring(selectBeginIndex + 7, orderByBeginIndex));
} else {
pageStr.append(sql.substring(selectBeginIndex + 7));
}
pageStr.append(" ");
pageStr.append(orderByString);
pageStr.append(") ta ");
pageStr.append(orderByStringD);
pageStr.append(") tb ");
pageStr.append(orderByString);
log.debug(pageStr.toString());
return pageStr.toString();
}
@Override
public String getPaginatedCountSql(String sql) {
int fromIndex = sql.toLowerCase().indexOf("from");
StringBuffer countStr = new StringBuffer("select count(*) ");
int sql_orderby = sql.toLowerCase().indexOf("order by");
if (sql_orderby >= 0) {
countStr.append(sql.substring(fromIndex, sql_orderby));
} else {
countStr.append(sql.substring(fromIndex));
}
String tempStr = countStr.toString();
log.debug(tempStr);
return tempStr;
}
}