项目初始导入
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
/**
|
||||
* Copyright © 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
|
||||
*/
|
||||
package com.nis.persistence.dialect;
|
||||
|
||||
|
||||
/**
|
||||
* Cluster方言的实现[神通数据库]
|
||||
*
|
||||
* @author poplar.yfyang
|
||||
* @version 1.0 2010-10-10 下午12:31
|
||||
* @since JDK 1.5
|
||||
*/
|
||||
public class ClusterDialect implements Dialect {
|
||||
|
||||
|
||||
@Override
|
||||
public String getLimitString(String sql, int offset, int limit) {
|
||||
return getLimitString(sql, offset, Integer.toString(offset),
|
||||
Integer.toString(limit));
|
||||
}
|
||||
|
||||
public boolean supportsLimit() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
|
||||
* <pre>
|
||||
* 如mysql
|
||||
* dialect.getLimitString("select * from user", 12, ":offset",0,":limit") 将返回
|
||||
* select * from user limit :offset,:limit
|
||||
* </pre>
|
||||
*
|
||||
* @param sql 实际SQL语句
|
||||
* @param offset 分页开始纪录条数
|
||||
* @param offsetPlaceholder 分页开始纪录条数-占位符号
|
||||
* @param limitPlaceholder 分页纪录条数占位符号
|
||||
* @return 包含占位符的分页sql
|
||||
*/
|
||||
public String getLimitString(String sql, int offset, String offsetPlaceholder, String limitPlaceholder) {
|
||||
StringBuilder stringBuilder = new StringBuilder(sql);
|
||||
if(stringBuilder.indexOf("limit") == -1 && stringBuilder.indexOf("LIMIT") == -1 ){
|
||||
stringBuilder.append(" limit ");
|
||||
stringBuilder.append(limitPlaceholder);
|
||||
stringBuilder.append(" offset ");
|
||||
stringBuilder.append(offsetPlaceholder);
|
||||
}
|
||||
System.out.println("cluster分页sql:"+stringBuilder.toString());
|
||||
return stringBuilder.toString();
|
||||
}
|
||||
|
||||
}
|
||||
88
src/main/java/com/nis/persistence/dialect/DB2Dialect.java
Normal file
88
src/main/java/com/nis/persistence/dialect/DB2Dialect.java
Normal file
@@ -0,0 +1,88 @@
|
||||
/**
|
||||
* Copyright © 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
|
||||
*/
|
||||
package com.nis.persistence.dialect;
|
||||
|
||||
|
||||
/**
|
||||
* DB2的分页数据库方言实现
|
||||
*
|
||||
* @author poplar.yfyang
|
||||
* @version 1.0 2010-10-10 下午12:31
|
||||
* @since JDK 1.5
|
||||
*/
|
||||
public class DB2Dialect implements Dialect {
|
||||
@Override
|
||||
public boolean supportsLimit() {
|
||||
return true;
|
||||
}
|
||||
|
||||
private static String getRowNumber(String sql) {
|
||||
StringBuilder rownumber = new StringBuilder(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().contains("select distinct");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLimitString(String sql, int offset, int limit) {
|
||||
return getLimitString(sql, offset, Integer.toString(offset), Integer.toString(limit));
|
||||
}
|
||||
|
||||
/**
|
||||
* 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
|
||||
* <pre>
|
||||
* 如mysql
|
||||
* dialect.getLimitString("select * from user", 12, ":offset",0,":limit") 将返回
|
||||
* select * from user limit :offset,:limit
|
||||
* </pre>
|
||||
*
|
||||
* @param sql 实际SQL语句
|
||||
* @param offset 分页开始纪录条数
|
||||
* @param offsetPlaceholder 分页开始纪录条数-占位符号
|
||||
* @param limitPlaceholder 分页纪录条数占位符号
|
||||
* @return 包含占位符的分页sql
|
||||
*/
|
||||
public String getLimitString(String sql, int offset, String offsetPlaceholder, String limitPlaceholder) {
|
||||
int startOfSelect = sql.toLowerCase().indexOf("select");
|
||||
|
||||
StringBuilder pagingSelect = new StringBuilder(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 ").append(offsetPlaceholder)
|
||||
.append("+1 and ").append(endString);
|
||||
} else {
|
||||
pagingSelect.append("<= ").append(limitPlaceholder);
|
||||
}
|
||||
|
||||
return pagingSelect.toString();
|
||||
}
|
||||
}
|
||||
43
src/main/java/com/nis/persistence/dialect/DerbyDialect.java
Normal file
43
src/main/java/com/nis/persistence/dialect/DerbyDialect.java
Normal file
@@ -0,0 +1,43 @@
|
||||
/**
|
||||
* Copyright © 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
|
||||
*/
|
||||
package com.nis.persistence.dialect;
|
||||
|
||||
|
||||
/**
|
||||
* @author poplar.yfyang
|
||||
* @version 1.0 2010-10-10 下午12:31
|
||||
* @since JDK 1.5
|
||||
*/
|
||||
public class DerbyDialect implements Dialect {
|
||||
@Override
|
||||
public boolean supportsLimit() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLimitString(String sql, int offset, int limit) {
|
||||
// return getLimitString(sql,offset,Integer.toString(offset),limit,Integer.toString(limit));
|
||||
throw new UnsupportedOperationException("paged queries not supported");
|
||||
}
|
||||
|
||||
/**
|
||||
* 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
|
||||
* <pre>
|
||||
* 如mysql
|
||||
* dialect.getLimitString("select * from user", 12, ":offset",0,":limit") 将返回
|
||||
* select * from user limit :offset,:limit
|
||||
* </pre>
|
||||
*
|
||||
* @param sql 实际SQL语句
|
||||
* @param offset 分页开始纪录条数
|
||||
* @param offsetPlaceholder 分页开始纪录条数-占位符号
|
||||
* @param limit 分页每页显示纪录条数
|
||||
* @param limitPlaceholder 分页纪录条数占位符号
|
||||
* @return 包含占位符的分页sql
|
||||
*/
|
||||
public String getLimitString(String sql, int offset,String offsetPlaceholder, int limit, String limitPlaceholder) {
|
||||
throw new UnsupportedOperationException( "paged queries not supported" );
|
||||
}
|
||||
|
||||
}
|
||||
33
src/main/java/com/nis/persistence/dialect/Dialect.java
Normal file
33
src/main/java/com/nis/persistence/dialect/Dialect.java
Normal file
@@ -0,0 +1,33 @@
|
||||
/**
|
||||
* Copyright © 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
|
||||
*/
|
||||
package com.nis.persistence.dialect;
|
||||
|
||||
/**
|
||||
* 类似hibernate的Dialect,但只精简出分页部分
|
||||
*
|
||||
* @author poplar.yfyang
|
||||
* @version 1.0 2011-11-18 下午12:31
|
||||
* @since JDK 1.5
|
||||
*/
|
||||
public interface Dialect {
|
||||
|
||||
/**
|
||||
* 数据库本身是否支持分页当前的分页查询方式
|
||||
* 如果数据库不支持的话,则不进行数据库分页
|
||||
*
|
||||
* @return true:支持当前的分页查询方式
|
||||
*/
|
||||
public boolean supportsLimit();
|
||||
|
||||
/**
|
||||
* 将sql转换为分页SQL,分别调用分页sql
|
||||
*
|
||||
* @param sql SQL语句
|
||||
* @param offset 开始条数
|
||||
* @param limit 每页显示多少纪录条数
|
||||
* @return 分页查询的sql
|
||||
*/
|
||||
public String getLimitString(String sql, int offset, int limit);
|
||||
|
||||
}
|
||||
44
src/main/java/com/nis/persistence/dialect/H2Dialect.java
Normal file
44
src/main/java/com/nis/persistence/dialect/H2Dialect.java
Normal file
@@ -0,0 +1,44 @@
|
||||
/**
|
||||
* Copyright © 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
|
||||
*/
|
||||
package com.nis.persistence.dialect;
|
||||
|
||||
|
||||
/**
|
||||
* A dialect compatible with the H2 database.
|
||||
*
|
||||
* @author poplar.yfyang
|
||||
* @version 1.0 2010-10-10 下午12:31
|
||||
* @since JDK 1.5
|
||||
*/
|
||||
public class H2Dialect implements Dialect {
|
||||
|
||||
public boolean supportsLimit() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
|
||||
* <pre>
|
||||
* 如mysql
|
||||
* dialect.getLimitString("select * from user", 12, ":offset",0,":limit") 将返回
|
||||
* select * from user limit :offset,:limit
|
||||
* </pre>
|
||||
*
|
||||
* @param sql 实际SQL语句
|
||||
* @param offset 分页开始纪录条数
|
||||
* @param offsetPlaceholder 分页开始纪录条数-占位符号
|
||||
* @param limit 分页每页显示纪录条数
|
||||
* @param limitPlaceholder 分页纪录条数占位符号
|
||||
* @return 包含占位符的分页sql
|
||||
*/
|
||||
private String getLimitString(String sql, int offset, String offsetPlaceholder, int limit, String limitPlaceholder) {
|
||||
return sql + ((offset > 0) ? " limit " + limitPlaceholder + " offset "
|
||||
+ offsetPlaceholder : " limit " + limitPlaceholder);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLimitString(String sql, int offset, int limit) {
|
||||
return getLimitString(sql, offset, Integer.toString(offset), limit, Integer.toString(limit));
|
||||
}
|
||||
}
|
||||
49
src/main/java/com/nis/persistence/dialect/HSQLDialect.java
Normal file
49
src/main/java/com/nis/persistence/dialect/HSQLDialect.java
Normal file
@@ -0,0 +1,49 @@
|
||||
/**
|
||||
* Copyright © 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
|
||||
*/
|
||||
package com.nis.persistence.dialect;
|
||||
|
||||
|
||||
/**
|
||||
* Dialect for HSQLDB
|
||||
*
|
||||
* @author poplar.yfyang
|
||||
* @version 1.0 2010-10-10 下午12:31
|
||||
* @since JDK 1.5
|
||||
*/
|
||||
public class HSQLDialect implements Dialect {
|
||||
@Override
|
||||
public boolean supportsLimit() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLimitString(String sql, int offset, int limit) {
|
||||
return getLimitString(sql, offset, Integer.toString(offset),
|
||||
Integer.toString(limit));
|
||||
}
|
||||
|
||||
/**
|
||||
* 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
|
||||
* <pre>
|
||||
* 如mysql
|
||||
* dialect.getLimitString("select * from user", 12, ":offset",0,":limit") 将返回
|
||||
* select * from user limit :offset,:limit
|
||||
* </pre>
|
||||
*
|
||||
* @param sql 实际SQL语句
|
||||
* @param offset 分页开始纪录条数
|
||||
* @param offsetPlaceholder 分页开始纪录条数-占位符号
|
||||
* @param limitPlaceholder 分页纪录条数占位符号
|
||||
* @return 包含占位符的分页sql
|
||||
*/
|
||||
public String getLimitString(String sql, int offset, String offsetPlaceholder, String limitPlaceholder) {
|
||||
boolean hasOffset = offset > 0;
|
||||
return
|
||||
new StringBuffer(sql.length() + 10)
|
||||
.append(sql)
|
||||
.insert(sql.toLowerCase().indexOf("select") + 6, hasOffset ? " limit " + offsetPlaceholder + " " + limitPlaceholder : " top " + limitPlaceholder)
|
||||
.toString();
|
||||
}
|
||||
|
||||
}
|
||||
52
src/main/java/com/nis/persistence/dialect/MySQLDialect.java
Normal file
52
src/main/java/com/nis/persistence/dialect/MySQLDialect.java
Normal file
@@ -0,0 +1,52 @@
|
||||
/**
|
||||
* Copyright © 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
|
||||
*/
|
||||
package com.nis.persistence.dialect;
|
||||
|
||||
|
||||
/**
|
||||
* Mysql方言的实现
|
||||
*
|
||||
* @author poplar.yfyang
|
||||
* @version 1.0 2010-10-10 下午12:31
|
||||
* @since JDK 1.5
|
||||
*/
|
||||
public class MySQLDialect implements Dialect {
|
||||
|
||||
|
||||
@Override
|
||||
public String getLimitString(String sql, int offset, int limit) {
|
||||
return getLimitString(sql, offset, Integer.toString(offset),
|
||||
Integer.toString(limit));
|
||||
}
|
||||
|
||||
public boolean supportsLimit() {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
|
||||
* <pre>
|
||||
* 如mysql
|
||||
* dialect.getLimitString("select * from user", 12, ":offset",0,":limit") 将返回
|
||||
* select * from user limit :offset,:limit
|
||||
* </pre>
|
||||
*
|
||||
* @param sql 实际SQL语句
|
||||
* @param offset 分页开始纪录条数
|
||||
* @param offsetPlaceholder 分页开始纪录条数-占位符号
|
||||
* @param limitPlaceholder 分页纪录条数占位符号
|
||||
* @return 包含占位符的分页sql
|
||||
*/
|
||||
public String getLimitString(String sql, int offset, String offsetPlaceholder, String limitPlaceholder) {
|
||||
StringBuilder stringBuilder = new StringBuilder(sql);
|
||||
stringBuilder.append(" limit ");
|
||||
if (offset > 0) {
|
||||
stringBuilder.append(offsetPlaceholder).append(",").append(limitPlaceholder);
|
||||
} else {
|
||||
stringBuilder.append(limitPlaceholder);
|
||||
}
|
||||
return stringBuilder.toString();
|
||||
}
|
||||
|
||||
}
|
||||
67
src/main/java/com/nis/persistence/dialect/OracleDialect.java
Normal file
67
src/main/java/com/nis/persistence/dialect/OracleDialect.java
Normal file
@@ -0,0 +1,67 @@
|
||||
/**
|
||||
* Copyright © 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
|
||||
*/
|
||||
package com.nis.persistence.dialect;
|
||||
|
||||
|
||||
/**
|
||||
* Oracle的方言实现
|
||||
* @author poplar.yfyang
|
||||
* @version 1.0 2010-10-10 下午12:31
|
||||
* @since JDK 1.5
|
||||
*/
|
||||
public class OracleDialect implements Dialect {
|
||||
@Override
|
||||
public boolean supportsLimit() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLimitString(String sql, int offset, int limit) {
|
||||
return getLimitString(sql, offset, Integer.toString(offset), Integer.toString(limit));
|
||||
}
|
||||
|
||||
/**
|
||||
* 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
|
||||
* <pre>
|
||||
* 如mysql
|
||||
* dialect.getLimitString("select * from user", 12, ":offset",0,":limit") 将返回
|
||||
* select * from user limit :offset,:limit
|
||||
* </pre>
|
||||
*
|
||||
* @param sql 实际SQL语句
|
||||
* @param offset 分页开始纪录条数
|
||||
* @param offsetPlaceholder 分页开始纪录条数-占位符号
|
||||
* @param limitPlaceholder 分页纪录条数占位符号
|
||||
* @return 包含占位符的分页sql
|
||||
*/
|
||||
public String getLimitString(String sql, int offset, String offsetPlaceholder, String limitPlaceholder) {
|
||||
sql = sql.trim();
|
||||
boolean isForUpdate = false;
|
||||
if (sql.toLowerCase().endsWith(" for update")) {
|
||||
sql = sql.substring(0, sql.length() - 11);
|
||||
isForUpdate = true;
|
||||
}
|
||||
StringBuilder pagingSelect = new StringBuilder(sql.length() + 100);
|
||||
|
||||
if (offset > 0) {
|
||||
pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( ");
|
||||
} else {
|
||||
pagingSelect.append("select * from ( ");
|
||||
}
|
||||
pagingSelect.append(sql);
|
||||
if (offset > 0) {
|
||||
String endString = offsetPlaceholder + "+" + limitPlaceholder;
|
||||
pagingSelect.append(" ) row_ where rownum <= "+endString+") where rownum_ > ").append(offsetPlaceholder);
|
||||
} else {
|
||||
pagingSelect.append(" ) where rownum <= "+limitPlaceholder);
|
||||
}
|
||||
|
||||
if (isForUpdate) {
|
||||
pagingSelect.append(" for update");
|
||||
}
|
||||
|
||||
return pagingSelect.toString();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
/**
|
||||
* Copyright © 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
|
||||
*/
|
||||
package com.nis.persistence.dialect;
|
||||
|
||||
|
||||
/**
|
||||
* Postgre Sql的方言实现
|
||||
* @author poplar.yfyang
|
||||
* @version 1.0 2010-10-10 下午12:31
|
||||
* @since JDK 1.5
|
||||
*/
|
||||
public class PostgreSQLDialect implements Dialect {
|
||||
|
||||
public boolean supportsLimit() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLimitString(String sql, int offset, int limit) {
|
||||
return getLimitString(sql, offset, Integer.toString(offset),
|
||||
Integer.toString(limit));
|
||||
}
|
||||
|
||||
/**
|
||||
* 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
|
||||
* <pre>
|
||||
* 如mysql
|
||||
* dialect.getLimitString("select * from user", 12, ":offset",0,":limit") 将返回
|
||||
* select * from user limit :offset,:limit
|
||||
* </pre>
|
||||
*
|
||||
* @param sql 实际SQL语句
|
||||
* @param offset 分页开始纪录条数
|
||||
* @param offsetPlaceholder 分页开始纪录条数-占位符号
|
||||
* @param limitPlaceholder 分页纪录条数占位符号
|
||||
* @return 包含占位符的分页sql
|
||||
*/
|
||||
public String getLimitString(String sql, int offset,
|
||||
String offsetPlaceholder, String limitPlaceholder) {
|
||||
StringBuilder pageSql = new StringBuilder().append(sql);
|
||||
pageSql = offset <= 0
|
||||
? pageSql.append(" limit ").append(limitPlaceholder) :
|
||||
pageSql.append(" limit ").append(limitPlaceholder).append(" offset ").append(offsetPlaceholder);
|
||||
return pageSql.toString();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
/**
|
||||
* Copyright © 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
|
||||
*/
|
||||
package com.nis.persistence.dialect;
|
||||
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
|
||||
|
||||
/**
|
||||
* Sql 2005的方言实现
|
||||
* @author poplar.yfyang
|
||||
* @version 1.0 2010-10-10 下午12:31
|
||||
* @since JDK 1.5
|
||||
*/
|
||||
public class SQLServer2005Dialect implements Dialect {
|
||||
|
||||
@Override
|
||||
public boolean supportsLimit() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getLimitString(String sql, int offset, int limit) {
|
||||
return getLimitString(sql, offset,
|
||||
limit, Integer.toString(limit));
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a LIMIT clause to the given SQL SELECT
|
||||
* <p/>
|
||||
* The LIMIT SQL will look like:
|
||||
* <p/>
|
||||
* 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 querySqlString 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
|
||||
* @param limitPlaceholder limitPlaceholder
|
||||
* @return A new SQL statement with the LIMIT clause applied.
|
||||
*/
|
||||
private String getLimitString(String querySqlString, int offset, int limit, String limitPlaceholder) {
|
||||
StringBuilder pagingBuilder = new StringBuilder();
|
||||
String orderby = getOrderByPart(querySqlString);
|
||||
String distinctStr = "";
|
||||
|
||||
String loweredString = querySqlString.toLowerCase();
|
||||
String sqlPartString = querySqlString;
|
||||
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 (StringUtils.isEmpty(orderby)) {
|
||||
orderby = "ORDER BY CURRENT_TIMESTAMP";
|
||||
}
|
||||
|
||||
StringBuilder result = new StringBuilder();
|
||||
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__ BETWEEN ")
|
||||
.append(offset).append(" AND ").append(offset + limit)
|
||||
.append(" ORDER BY __row_number__");
|
||||
|
||||
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 "";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
/**
|
||||
* Copyright © 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
|
||||
*/
|
||||
package com.nis.persistence.dialect;
|
||||
|
||||
|
||||
/**
|
||||
* MSSQLServer 数据库实现分页方言
|
||||
*
|
||||
* @author poplar.yfyang
|
||||
* @version 1.0 2010-10-10 下午12:31
|
||||
* @since JDK 1.5
|
||||
*/
|
||||
public class SQLServerDialect implements Dialect {
|
||||
|
||||
public boolean supportsLimit() {
|
||||
return true;
|
||||
}
|
||||
|
||||
static int getAfterSelectInsertPoint(String sql) {
|
||||
int selectIndex = sql.toLowerCase().indexOf("select");
|
||||
final int selectDistinctIndex = sql.toLowerCase().indexOf("select distinct");
|
||||
return selectIndex + (selectDistinctIndex == selectIndex ? 15 : 6);
|
||||
}
|
||||
|
||||
public String getLimitString(String sql, int offset, int limit) {
|
||||
return getLimit(sql, offset, limit);
|
||||
}
|
||||
|
||||
/**
|
||||
* 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
|
||||
* <pre>
|
||||
* 如mysql
|
||||
* dialect.getLimitString("select * from user", 12, ":offset",0,":limit") 将返回
|
||||
* select * from user limit :offset,:limit
|
||||
* </pre>
|
||||
*
|
||||
* @param sql 实际SQL语句
|
||||
* @param offset 分页开始纪录条数
|
||||
* @param limit 分页每页显示纪录条数
|
||||
* @return 包含占位符的分页sql
|
||||
*/
|
||||
public String getLimit(String sql, int offset, int limit) {
|
||||
if (offset > 0) {
|
||||
throw new UnsupportedOperationException("sql server has no offset");
|
||||
}
|
||||
return new StringBuffer(sql.length() + 8)
|
||||
.append(sql)
|
||||
.insert(getAfterSelectInsertPoint(sql), " top " + limit)
|
||||
.toString();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
46
src/main/java/com/nis/persistence/dialect/SybaseDialect.java
Normal file
46
src/main/java/com/nis/persistence/dialect/SybaseDialect.java
Normal file
@@ -0,0 +1,46 @@
|
||||
/**
|
||||
* Copyright © 2012-2014 <a href="https://github.com/thinkgem/jeesite">JeeSite</a> All rights reserved.
|
||||
*/
|
||||
package com.nis.persistence.dialect;
|
||||
|
||||
|
||||
/**
|
||||
* Sybase数据库分页方言实现。
|
||||
* 还未实现
|
||||
*
|
||||
* @author poplar.yfyang
|
||||
* @version 1.0 2010-10-10 下午12:31
|
||||
* @since JDK 1.5
|
||||
*/
|
||||
public class SybaseDialect implements Dialect {
|
||||
|
||||
public boolean supportsLimit() {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getLimitString(String sql, int offset, int limit) {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将sql变成分页sql语句,提供将offset及limit使用占位符号(placeholder)替换.
|
||||
* <pre>
|
||||
* 如mysql
|
||||
* dialect.getLimitString("select * from user", 12, ":offset",0,":limit") 将返回
|
||||
* select * from user limit :offset,:limit
|
||||
* </pre>
|
||||
*
|
||||
* @param sql 实际SQL语句
|
||||
* @param offset 分页开始纪录条数
|
||||
* @param offsetPlaceholder 分页开始纪录条数-占位符号
|
||||
* @param limit 分页每页显示纪录条数
|
||||
* @param limitPlaceholder 分页纪录条数占位符号
|
||||
* @return 包含占位符的分页sql
|
||||
*/
|
||||
public String getLimitString(String sql, int offset, String offsetPlaceholder, int limit, String limitPlaceholder) {
|
||||
throw new UnsupportedOperationException("paged queries not supported");
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user