package cn.org.rapid_framework.jdbc.dialect; /** * @author badqiu */ public class DB2Dialect extends Dialect{ public boolean supportsLimit() { return true; } public boolean supportsLimitOffset(){ return true; } private static String getRowNumber(String sql) { StringBuffer rownumber = new StringBuffer(50) .append("rownumber() over("); int orderByIndex = sql.toLowerCase().indexOf("order by"); if ( orderByIndex>0 && !hasDistinct(sql) ) { rownumber.append( sql.substring(orderByIndex) ); } rownumber.append(") as rownumber_,"); return rownumber.toString(); } private static boolean hasDistinct(String sql) { return sql.toLowerCase().indexOf("select distinct")>=0; } public String getLimitString(String sql, int offset,String offsetPlaceholder, int limit, String limitPlaceholder) { int startOfSelect = sql.toLowerCase().indexOf("select"); StringBuffer pagingSelect = new StringBuffer( sql.length()+100 ) .append( sql.substring(0, startOfSelect) ) //add the comment .append("select * from ( select ") //nest the main query in an outer select .append( getRowNumber(sql) ); //add the rownnumber bit into the outer query select list if ( hasDistinct(sql) ) { pagingSelect.append(" row_.* from ( ") //add another (inner) nested select .append( sql.substring(startOfSelect) ) //add the main query .append(" ) as row_"); //close off the inner nested select } else { pagingSelect.append( sql.substring( startOfSelect + 6 ) ); //add the main query } pagingSelect.append(" ) as temp_ where rownumber_ "); //add the restriction to the outer select if (offset > 0) { // int end = offset + limit; String endString = offsetPlaceholder+"+"+limitPlaceholder; pagingSelect.append("between "+offsetPlaceholder+"+1 and "+endString); } else { pagingSelect.append("<= "+limitPlaceholder); } return pagingSelect.toString(); } }