executeQuerySheet

This commit is contained in:
redkale
2024-06-06 17:24:08 +08:00
parent 43012a5399
commit 02202e3d06
2 changed files with 71 additions and 84 deletions

View File

@@ -174,7 +174,6 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource
final String joinAndWhere = (join == null ? "" : join) + (Utility.isEmpty(where) ? "" : (" WHERE " + where));
String pageSql = null;
String countSql = null;
boolean containsLimit = false;
// 组装pageSql、countSql
String listSubSql;
StringBuilder union = new StringBuilder();
@@ -204,15 +203,12 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource
int end = flipper.getOffset() + flipper.getLimit();
pageSql = "SELECT * FROM (SELECT T_.*, ROWNUM RN_ FROM (" + pageSql + ") T_) WHERE RN_ BETWEEN " + start
+ " AND " + end;
containsLimit = true;
} else if ("sqlserver".equals(dbtype)) {
int offset = flipper.getOffset();
int limit = flipper.getLimit();
pageSql += " OFFSET " + offset + " ROWS FETCH NEXT " + limit + " ROWS ONLY";
containsLimit = true;
} else { // 按mysql、postgresql、mariadb、h2处理
pageSql += " LIMIT " + flipper.getLimit() + " OFFSET " + flipper.getOffset();
containsLimit = true;
}
}
// countSql
@@ -237,7 +233,7 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource
logger.finest(
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
public final String countSql;
public final boolean pageContainsLimit;
public PageCountSql(String pageSql, String countSql, boolean pageContainsLimit) {
public PageCountSql(String pageSql, String countSql) {
this.pageSql = pageSql;
this.countSql = countSql;
this.pageContainsLimit = pageContainsLimit;
}
@Override

View File

@@ -2392,7 +2392,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
conn.setAutoCommit(true);
PageCountSql sqls = createPageCountSql(info, readCache, needTotal, distinct, sels, tables, flipper, node);
try {
return executeQuerySheet(info, needTotal, flipper, sels, s, conn, sqls);
return executeQuerySheet(info, needTotal, sels, s, conn, sqls);
} catch (SQLException se) {
if (isTableNotExist(info, se, se.getSQLState())) {
if (info.getTableStrategy() == null) {
@@ -2430,7 +2430,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
// 重新查询一次
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 {
throw new SourceException(se);
}
@@ -2447,84 +2447,78 @@ public class DataJdbcSource extends AbstractDataSqlSource {
}
private <T> Sheet<T> executeQuerySheet(
EntityInfo<T> info,
boolean needTotal,
Flipper flipper,
SelectColumn sels,
long s,
JdbcConnection conn,
PageCountSql sqls)
EntityInfo<T> info, boolean needTotal, SelectColumn sels, long s, JdbcConnection conn, PageCountSql sqls)
throws SQLException {
final List<T> list = new ArrayList();
if (sqls.pageContainsLimit) { // sql可以带limit、offset
ResultSet set;
PreparedStatement prestmt;
long total = -1;
if (needTotal) {
prestmt = conn.prepareQueryStatement(sqls.countSql);
set = prestmt.executeQuery();
if (set.next()) {
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();
// if (sqls.pageContainsLimit) { sql可以带limit、offset
ResultSet set;
PreparedStatement preStmt;
long total = -1;
if (needTotal) {
preStmt = conn.prepareQueryStatement(sqls.countSql);
set = preStmt.executeQuery();
if (set.next()) {
total = set.getLong(1);
}
set.close();
conn.offerQueryStatement(prestmt);
slowLog(s, sqls.pageSql);
return new Sheet<>(total, list);
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();
// conn.offerQueryStatement(prestmt);
// slowLog(s, sqls.pageSql);
// return new Sheet<>(total, list);
// }
}
protected List<String> checkNotExistTablesNoThrows(JdbcConnection conn, String[] tables) {