From 02202e3d0679e08824a40525fa9ae39807ae6698 Mon Sep 17 00:00:00 2001 From: redkale Date: Thu, 6 Jun 2024 17:24:08 +0800 Subject: [PATCH] executeQuerySheet --- .../redkale/source/AbstractDataSqlSource.java | 11 +- .../org/redkale/source/DataJdbcSource.java | 144 +++++++++--------- 2 files changed, 71 insertions(+), 84 deletions(-) diff --git a/src/main/java/org/redkale/source/AbstractDataSqlSource.java b/src/main/java/org/redkale/source/AbstractDataSqlSource.java index 8c09c32e0..f810b7b58 100644 --- a/src/main/java/org/redkale/source/AbstractDataSqlSource.java +++ b/src/main/java/org/redkale/source/AbstractDataSqlSource.java @@ -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 diff --git a/src/main/java/org/redkale/source/DataJdbcSource.java b/src/main/java/org/redkale/source/DataJdbcSource.java index 8f9d04a5f..1e58aeaa0 100644 --- a/src/main/java/org/redkale/source/DataJdbcSource.java +++ b/src/main/java/org/redkale/source/DataJdbcSource.java @@ -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 Sheet executeQuerySheet( - EntityInfo info, - boolean needTotal, - Flipper flipper, - SelectColumn sels, - long s, - JdbcConnection conn, - PageCountSql sqls) + EntityInfo info, boolean needTotal, SelectColumn sels, long s, JdbcConnection conn, PageCountSql sqls) throws SQLException { final List 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 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 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 checkNotExistTablesNoThrows(JdbcConnection conn, String[] tables) {