?? pagedbytop.java
字號:
package com.ztes.commons.dbo.pagination.impl;
import com.ztes.commons.dbo.pagination.Page;
import com.ztes.commons.dbo.pagination.AbstractPage;
/**
* 使用Top關(guān)鍵字分頁,適合的數(shù)據(jù)庫有:sqlserver,Sysbase,access。
* 如果要達(dá)到用sql語句分頁的效果,則sql語句不能是聯(lián)合查詢,必須指定排序字段,并且是唯一的,
* 而且排序字段不能有重復(fù)數(shù)據(jù),否則不能達(dá)到你想要的分頁效果。
* 典型的支持sql分頁的語句如同:select userId,userName from users order by userId。
* 特別注意的是,當(dāng)指定的一個(gè)排序字段不是唯一值(即有重復(fù)值),則不能使用SQL語句分頁,并且需要手動指定采用JDBC功能分頁,
* 請調(diào)用{@link com.ztes.commons.dbo.pagination.Page#setUseCommonPage(boolean)}方法,設(shè)置參數(shù)為true。
*
* @author tiannet(曾次清)
*/
public class PagedByTop extends AbstractPage implements Page {
/**
* 是否支持sql語句分頁,需要對sql語句具體分析。
* @return 如果支持sql語句分頁返回true,否則返回false。
*/
protected boolean isSupportPageSql() {
//聯(lián)合查詢不能直接使用sql語句分頁
if( super.getSqlParser().isUnionQuery() ) {
logger.debug("聯(lián)合查詢,無法使用sql語句分頁");
return false;
}
//未指定order by的sql語句不支持
if( !super.getSqlParser().hasOrderBy() ) {
logger.debug("查詢語句中不含order by,無法使用sql語句分頁");
return false;
}
String orderField = super.getSqlParser().getOrderField();
//排序字段必須指定并且唯一
if( orderField == null || orderField.indexOf(",") > 0 ) {
logger.debug("未指定排序字段或者排序字段不唯一,無法使用sql語句分頁");
return false;
}
return true;
}//~ isSupportPageSql
/**
* 返回分頁sql語句。
* sqlserver分頁的sql語句型如:
* <pre>
* select top 頁大小 *
from table1
where id>
(select max (id) from
(select top ((頁碼-1)*頁大小) id from table1 order by id) as T)
order by id
*</pre>
* @param start 獲取記錄的開始位置,從零開始計(jì)。
* @param size 獲取記錄的大小。
* @return 分頁sql語句。
*/
public String getPageSql(int start, int size) {
//如果是第一頁
if( start <= 0 ) {
return "select top " + size + " " + super.getSqlParser().getSqlAfterSelect();
}
StringBuffer sql = new StringBuffer();
String temp = "";
if( super.getSqlParser().isOrderAsc() ) {
//升序處理
temp = " >(select max(" + super.getSqlParser().getOrderField() + ") from ";
} else {
//降序處理
temp = " <(select min(" + super.getSqlParser().getOrderField() + ") from ";
}
sql.append("select top " + size + " " + super.getSqlParser().getSqlBetweenSelectAndFrom() + " from ");
sql.append( super.getSqlParser().getSqlBetweenFromAndWhere() );
sql.append(" where " + super.getSqlParser().getOrderField() + temp);
sql.append( getTopOrderFieldSql(start) + ")" );
if( super.getSqlParser().hasWhere() ) {
sql.append(" and ");
}
sql.append( " " + super.getSqlParser().getSqlAfterWhere() );
return sql.toString();
}
/**
* 得到獲取排序字段最前的指定大小記錄
* @param top
* @return
*/
private String getTopOrderFieldSql(int top) {
return "(select top " + top + " " + super.getSqlParser().getOrderField() + " from "
+ super.getSqlParser().getSqlAfterFrom() + ") as pageTblTemp" ;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -