executeQuerySheet
This commit is contained in:
@@ -174,7 +174,6 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource
|
|||||||
final String joinAndWhere = (join == null ? "" : join) + (Utility.isEmpty(where) ? "" : (" WHERE " + where));
|
final String joinAndWhere = (join == null ? "" : join) + (Utility.isEmpty(where) ? "" : (" WHERE " + where));
|
||||||
String pageSql = null;
|
String pageSql = null;
|
||||||
String countSql = null;
|
String countSql = null;
|
||||||
boolean containsLimit = false;
|
|
||||||
// 组装pageSql、countSql
|
// 组装pageSql、countSql
|
||||||
String listSubSql;
|
String listSubSql;
|
||||||
StringBuilder union = new StringBuilder();
|
StringBuilder union = new StringBuilder();
|
||||||
@@ -204,15 +203,12 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource
|
|||||||
int end = flipper.getOffset() + flipper.getLimit();
|
int end = flipper.getOffset() + flipper.getLimit();
|
||||||
pageSql = "SELECT * FROM (SELECT T_.*, ROWNUM RN_ FROM (" + pageSql + ") T_) WHERE RN_ BETWEEN " + start
|
pageSql = "SELECT * FROM (SELECT T_.*, ROWNUM RN_ FROM (" + pageSql + ") T_) WHERE RN_ BETWEEN " + start
|
||||||
+ " AND " + end;
|
+ " AND " + end;
|
||||||
containsLimit = true;
|
|
||||||
} else if ("sqlserver".equals(dbtype)) {
|
} else if ("sqlserver".equals(dbtype)) {
|
||||||
int offset = flipper.getOffset();
|
int offset = flipper.getOffset();
|
||||||
int limit = flipper.getLimit();
|
int limit = flipper.getLimit();
|
||||||
pageSql += " OFFSET " + offset + " ROWS FETCH NEXT " + limit + " ROWS ONLY";
|
pageSql += " OFFSET " + offset + " ROWS FETCH NEXT " + limit + " ROWS ONLY";
|
||||||
containsLimit = true;
|
|
||||||
} else { // 按mysql、postgresql、mariadb、h2处理
|
} else { // 按mysql、postgresql、mariadb、h2处理
|
||||||
pageSql += " LIMIT " + flipper.getLimit() + " OFFSET " + flipper.getOffset();
|
pageSql += " LIMIT " + flipper.getLimit() + " OFFSET " + flipper.getOffset();
|
||||||
containsLimit = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// countSql
|
// countSql
|
||||||
@@ -237,7 +233,7 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource
|
|||||||
logger.finest(
|
logger.finest(
|
||||||
info.getType().getSimpleName() + prefix + (needTotal ? " page-sql=" : " list-sql=") + pageSql);
|
info.getType().getSimpleName() + prefix + (needTotal ? " page-sql=" : " list-sql=") + pageSql);
|
||||||
}
|
}
|
||||||
return new PageCountSql(pageSql, countSql, containsLimit);
|
return new PageCountSql(pageSql, countSql);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -3989,12 +3985,9 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource
|
|||||||
@Nullable
|
@Nullable
|
||||||
public final String countSql;
|
public final String countSql;
|
||||||
|
|
||||||
public final boolean pageContainsLimit;
|
public PageCountSql(String pageSql, String countSql) {
|
||||||
|
|
||||||
public PageCountSql(String pageSql, String countSql, boolean pageContainsLimit) {
|
|
||||||
this.pageSql = pageSql;
|
this.pageSql = pageSql;
|
||||||
this.countSql = countSql;
|
this.countSql = countSql;
|
||||||
this.pageContainsLimit = pageContainsLimit;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -2392,7 +2392,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
|
|||||||
conn.setAutoCommit(true);
|
conn.setAutoCommit(true);
|
||||||
PageCountSql sqls = createPageCountSql(info, readCache, needTotal, distinct, sels, tables, flipper, node);
|
PageCountSql sqls = createPageCountSql(info, readCache, needTotal, distinct, sels, tables, flipper, node);
|
||||||
try {
|
try {
|
||||||
return executeQuerySheet(info, needTotal, flipper, sels, s, conn, sqls);
|
return executeQuerySheet(info, needTotal, sels, s, conn, sqls);
|
||||||
} catch (SQLException se) {
|
} catch (SQLException se) {
|
||||||
if (isTableNotExist(info, se, se.getSQLState())) {
|
if (isTableNotExist(info, se, se.getSQLState())) {
|
||||||
if (info.getTableStrategy() == null) {
|
if (info.getTableStrategy() == null) {
|
||||||
@@ -2430,7 +2430,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
|
|||||||
|
|
||||||
// 重新查询一次
|
// 重新查询一次
|
||||||
sqls = createPageCountSql(info, readCache, needTotal, distinct, sels, tables, flipper, node);
|
sqls = createPageCountSql(info, readCache, needTotal, distinct, sels, tables, flipper, node);
|
||||||
return executeQuerySheet(info, needTotal, flipper, sels, s, conn, sqls);
|
return executeQuerySheet(info, needTotal, sels, s, conn, sqls);
|
||||||
} else {
|
} else {
|
||||||
throw new SourceException(se);
|
throw new SourceException(se);
|
||||||
}
|
}
|
||||||
@@ -2447,84 +2447,78 @@ public class DataJdbcSource extends AbstractDataSqlSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private <T> Sheet<T> executeQuerySheet(
|
private <T> Sheet<T> executeQuerySheet(
|
||||||
EntityInfo<T> info,
|
EntityInfo<T> info, boolean needTotal, SelectColumn sels, long s, JdbcConnection conn, PageCountSql sqls)
|
||||||
boolean needTotal,
|
|
||||||
Flipper flipper,
|
|
||||||
SelectColumn sels,
|
|
||||||
long s,
|
|
||||||
JdbcConnection conn,
|
|
||||||
PageCountSql sqls)
|
|
||||||
throws SQLException {
|
throws SQLException {
|
||||||
final List<T> list = new ArrayList();
|
final List<T> list = new ArrayList();
|
||||||
if (sqls.pageContainsLimit) { // sql可以带limit、offset
|
// if (sqls.pageContainsLimit) { sql可以带limit、offset
|
||||||
ResultSet set;
|
ResultSet set;
|
||||||
PreparedStatement prestmt;
|
PreparedStatement preStmt;
|
||||||
long total = -1;
|
long total = -1;
|
||||||
if (needTotal) {
|
if (needTotal) {
|
||||||
prestmt = conn.prepareQueryStatement(sqls.countSql);
|
preStmt = conn.prepareQueryStatement(sqls.countSql);
|
||||||
set = prestmt.executeQuery();
|
set = preStmt.executeQuery();
|
||||||
if (set.next()) {
|
if (set.next()) {
|
||||||
total = set.getLong(1);
|
total = set.getLong(1);
|
||||||
}
|
|
||||||
set.close();
|
|
||||||
conn.offerQueryStatement(prestmt);
|
|
||||||
slowLog(s, sqls.countSql);
|
|
||||||
}
|
|
||||||
if (total != 0) {
|
|
||||||
prestmt = conn.prepareQueryStatement(sqls.pageSql);
|
|
||||||
set = prestmt.executeQuery();
|
|
||||||
final DataResultSet rr = createDataResultSet(info, set);
|
|
||||||
while (set.next()) {
|
|
||||||
list.add(getEntityValue(info, sels, rr));
|
|
||||||
}
|
|
||||||
set.close();
|
|
||||||
conn.offerQueryStatement(prestmt);
|
|
||||||
if (!needTotal) {
|
|
||||||
total = list.size();
|
|
||||||
}
|
|
||||||
slowLog(s, sqls.pageSql);
|
|
||||||
}
|
|
||||||
return new Sheet<>(total, list);
|
|
||||||
} else {
|
|
||||||
PreparedStatement prestmt = conn.prepareQueryStatement(sqls.pageSql);
|
|
||||||
if (flipper != null && flipper.getLimit() > 0) {
|
|
||||||
prestmt.setFetchSize(flipper.getLimit());
|
|
||||||
}
|
|
||||||
ResultSet set = prestmt.executeQuery();
|
|
||||||
if (flipper != null && flipper.getOffset() > 0) {
|
|
||||||
set.absolute(flipper.getOffset());
|
|
||||||
}
|
|
||||||
final int limit = Flipper.validLimit(flipper) ? flipper.getLimit() : Integer.MAX_VALUE;
|
|
||||||
int i = 0;
|
|
||||||
final DataResultSet rr = createDataResultSet(info, set);
|
|
||||||
EntityBuilder<T> builder = info.getBuilder();
|
|
||||||
if (sels == null) {
|
|
||||||
while (set.next()) {
|
|
||||||
i++;
|
|
||||||
list.add(builder.getFullEntityValue(rr));
|
|
||||||
if (limit <= i) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
while (set.next()) {
|
|
||||||
i++;
|
|
||||||
list.add(builder.getEntityValue(sels, rr));
|
|
||||||
if (limit <= i) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
long total = list.size();
|
|
||||||
if (needTotal && flipper != null) {
|
|
||||||
set.last();
|
|
||||||
total = set.getRow();
|
|
||||||
}
|
}
|
||||||
set.close();
|
set.close();
|
||||||
conn.offerQueryStatement(prestmt);
|
conn.offerQueryStatement(preStmt);
|
||||||
slowLog(s, sqls.pageSql);
|
slowLog(s, sqls.countSql);
|
||||||
return new Sheet<>(total, list);
|
|
||||||
}
|
}
|
||||||
|
if (total != 0) {
|
||||||
|
preStmt = conn.prepareQueryStatement(sqls.pageSql);
|
||||||
|
set = preStmt.executeQuery();
|
||||||
|
final DataResultSet rr = createDataResultSet(info, set);
|
||||||
|
while (set.next()) {
|
||||||
|
list.add(getEntityValue(info, sels, rr));
|
||||||
|
}
|
||||||
|
set.close();
|
||||||
|
conn.offerQueryStatement(preStmt);
|
||||||
|
if (!needTotal) {
|
||||||
|
total = list.size();
|
||||||
|
}
|
||||||
|
slowLog(s, sqls.pageSql);
|
||||||
|
}
|
||||||
|
return new Sheet<>(total, list);
|
||||||
|
// } else {
|
||||||
|
// PreparedStatement prestmt = conn.prepareQueryStatement(sqls.pageSql);
|
||||||
|
// if (flipper != null && flipper.getLimit() > 0) {
|
||||||
|
// prestmt.setFetchSize(flipper.getLimit());
|
||||||
|
// }
|
||||||
|
// ResultSet set = prestmt.executeQuery();
|
||||||
|
// if (flipper != null && flipper.getOffset() > 0) {
|
||||||
|
// set.absolute(flipper.getOffset());
|
||||||
|
// }
|
||||||
|
// final int limit = Flipper.validLimit(flipper) ? flipper.getLimit() : Integer.MAX_VALUE;
|
||||||
|
// int i = 0;
|
||||||
|
// final DataResultSet rr = createDataResultSet(info, set);
|
||||||
|
// EntityBuilder<T> builder = info.getBuilder();
|
||||||
|
// if (sels == null) {
|
||||||
|
// while (set.next()) {
|
||||||
|
// i++;
|
||||||
|
// list.add(builder.getFullEntityValue(rr));
|
||||||
|
// if (limit <= i) {
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// } else {
|
||||||
|
// while (set.next()) {
|
||||||
|
// i++;
|
||||||
|
// list.add(builder.getEntityValue(sels, rr));
|
||||||
|
// if (limit <= i) {
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// long total = list.size();
|
||||||
|
// if (needTotal && flipper != null) {
|
||||||
|
// set.last();
|
||||||
|
// total = set.getRow();
|
||||||
|
// }
|
||||||
|
// set.close();
|
||||||
|
// conn.offerQueryStatement(prestmt);
|
||||||
|
// slowLog(s, sqls.pageSql);
|
||||||
|
// return new Sheet<>(total, list);
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
protected List<String> checkNotExistTablesNoThrows(JdbcConnection conn, String[] tables) {
|
protected List<String> checkNotExistTablesNoThrows(JdbcConnection conn, String[] tables) {
|
||||||
|
|||||||
Reference in New Issue
Block a user