createLimitSQL
This commit is contained in:
@@ -231,8 +231,8 @@ public abstract class AbstractDataSource extends AbstractService implements Data
|
|||||||
* @param flipper 翻页参数
|
* @param flipper 翻页参数
|
||||||
* @return SQL
|
* @return SQL
|
||||||
*/
|
*/
|
||||||
protected <T> String createSQLOrderby(EntityInfo<T> info, Flipper flipper) {
|
protected <T> String createOrderbySql(EntityInfo<T> info, Flipper flipper) {
|
||||||
return info.createSQLOrderby(flipper);
|
return info.createOrderbySql(flipper);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -5,10 +5,6 @@
|
|||||||
*/
|
*/
|
||||||
package org.redkale.source;
|
package org.redkale.source;
|
||||||
|
|
||||||
import static org.redkale.boot.Application.*;
|
|
||||||
import static org.redkale.source.DataSources.*;
|
|
||||||
import static org.redkale.util.Utility.isEmpty;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.math.*;
|
import java.math.*;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
@@ -21,13 +17,16 @@ import java.util.stream.Stream;
|
|||||||
import org.redkale.annotation.*;
|
import org.redkale.annotation.*;
|
||||||
import org.redkale.annotation.AutoLoad;
|
import org.redkale.annotation.AutoLoad;
|
||||||
import org.redkale.annotation.ResourceType;
|
import org.redkale.annotation.ResourceType;
|
||||||
|
import static org.redkale.boot.Application.*;
|
||||||
import org.redkale.convert.ConvertDisabled;
|
import org.redkale.convert.ConvertDisabled;
|
||||||
import org.redkale.inject.ResourceEvent;
|
import org.redkale.inject.ResourceEvent;
|
||||||
import org.redkale.net.AsyncGroup;
|
import org.redkale.net.AsyncGroup;
|
||||||
import org.redkale.persistence.Table;
|
import org.redkale.persistence.Table;
|
||||||
import org.redkale.service.Local;
|
import org.redkale.service.Local;
|
||||||
|
import static org.redkale.source.DataSources.*;
|
||||||
import org.redkale.source.EntityInfo.EntityColumn;
|
import org.redkale.source.EntityInfo.EntityColumn;
|
||||||
import org.redkale.util.*;
|
import org.redkale.util.*;
|
||||||
|
import static org.redkale.util.Utility.isEmpty;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* DataSource的SQL抽象实现类 <br>
|
* DataSource的SQL抽象实现类 <br>
|
||||||
@@ -157,6 +156,17 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource
|
|||||||
readConfProps.getProperty(DATA_SOURCE_SLOWMS_ERROR, "3000").trim());
|
readConfProps.getProperty(DATA_SOURCE_SLOWMS_ERROR, "3000").trim());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected String createLimitSQL(String listSql, Flipper flipper) {
|
||||||
|
if (flipper == null || flipper.getLimit() < 1) {
|
||||||
|
return listSql;
|
||||||
|
}
|
||||||
|
final boolean mysqlOrPgsql = "mysql".equals(dbtype()) || "postgresql".equals(dbtype());
|
||||||
|
if (mysqlOrPgsql) {
|
||||||
|
return listSql + " LIMIT " + flipper.getLimit() + " OFFSET " + flipper.getOffset();
|
||||||
|
}
|
||||||
|
throw new SourceException("Not support page sql: " + listSql);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ResourceChanged
|
@ResourceChanged
|
||||||
public void onResourceChange(ResourceEvent[] events) {
|
public void onResourceChange(ResourceEvent[] events) {
|
||||||
@@ -1458,7 +1468,7 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource
|
|||||||
String sql = "DELETE FROM " + table + " a" + (join1 == null ? "" : (", " + join1))
|
String sql = "DELETE FROM " + table + " a" + (join1 == null ? "" : (", " + join1))
|
||||||
+ " WHERE " + info.getPrimarySQLColumn() + " IN (SELECT " + info.getPrimaryField() + " FROM "
|
+ " WHERE " + info.getPrimarySQLColumn() + " IN (SELECT " + info.getPrimaryField() + " FROM "
|
||||||
+ table
|
+ table
|
||||||
+ join2AndWhere + info.createSQLOrderby(flipper) + " OFFSET 0 LIMIT " + flipper.getLimit()
|
+ join2AndWhere + info.createOrderbySql(flipper) + " OFFSET 0 LIMIT " + flipper.getLimit()
|
||||||
+ ")";
|
+ ")";
|
||||||
sqls.add(sql);
|
sqls.add(sql);
|
||||||
}
|
}
|
||||||
@@ -1468,7 +1478,7 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource
|
|||||||
List<String> sqls = new ArrayList<>();
|
List<String> sqls = new ArrayList<>();
|
||||||
for (String table : tables) {
|
for (String table : tables) {
|
||||||
String sql = "DELETE " + (mysql ? "a" : "") + " FROM " + table + " a"
|
String sql = "DELETE " + (mysql ? "a" : "") + " FROM " + table + " a"
|
||||||
+ (join1 == null ? "" : (", " + join1)) + join2AndWhere + info.createSQLOrderby(flipper)
|
+ (join1 == null ? "" : (", " + join1)) + join2AndWhere + info.createOrderbySql(flipper)
|
||||||
+ ((mysql && flipper != null && flipper.getLimit() > 0)
|
+ ((mysql && flipper != null && flipper.getLimit() > 0)
|
||||||
? (" LIMIT " + flipper.getLimit())
|
? (" LIMIT " + flipper.getLimit())
|
||||||
: "");
|
: "");
|
||||||
@@ -2144,14 +2154,14 @@ public abstract class AbstractDataSqlSource extends AbstractDataSource
|
|||||||
sql = "UPDATE " + tables[0] + " a " + (join1 == null ? "" : (", " + join1)) + " SET " + setsql
|
sql = "UPDATE " + tables[0] + " a " + (join1 == null ? "" : (", " + join1)) + " SET " + setsql
|
||||||
+ " WHERE " + info.getPrimarySQLColumn() + " IN (SELECT " + info.getPrimaryField() + " FROM "
|
+ " WHERE " + info.getPrimarySQLColumn() + " IN (SELECT " + info.getPrimaryField() + " FROM "
|
||||||
+ tables[0]
|
+ tables[0]
|
||||||
+ wherestr + info.createSQLOrderby(flipper) + " OFFSET 0 LIMIT " + flipper.getLimit() + ")";
|
+ wherestr + info.createOrderbySql(flipper) + " OFFSET 0 LIMIT " + flipper.getLimit() + ")";
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
sql = "UPDATE " + tables[0] + " a " + (join1 == null ? "" : (", " + join1)) + " SET " + setsql
|
sql = "UPDATE " + tables[0] + " a " + (join1 == null ? "" : (", " + join1)) + " SET " + setsql
|
||||||
+ ((where == null || where.length() == 0)
|
+ ((where == null || where.length() == 0)
|
||||||
? (join2 == null ? "" : (" WHERE " + join2))
|
? (join2 == null ? "" : (" WHERE " + join2))
|
||||||
: (" WHERE " + where + (join2 == null ? "" : (" AND " + join2))))
|
: (" WHERE " + where + (join2 == null ? "" : (" AND " + join2))))
|
||||||
+ info.createSQLOrderby(flipper)
|
+ info.createOrderbySql(flipper)
|
||||||
+ (("mysql".equals(dbtype()) && flipper != null && flipper.getLimit() > 0)
|
+ (("mysql".equals(dbtype()) && flipper != null && flipper.getLimit() > 0)
|
||||||
? (" LIMIT " + flipper.getLimit())
|
? (" LIMIT " + flipper.getLimit())
|
||||||
: "");
|
: "");
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
*/
|
*/
|
||||||
package org.redkale.source;
|
package org.redkale.source;
|
||||||
|
|
||||||
import static org.redkale.source.DataSources.*;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.sql.*;
|
import java.sql.*;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@@ -20,6 +18,7 @@ import org.redkale.annotation.AutoLoad;
|
|||||||
import org.redkale.annotation.ResourceType;
|
import org.redkale.annotation.ResourceType;
|
||||||
import org.redkale.inject.ResourceEvent;
|
import org.redkale.inject.ResourceEvent;
|
||||||
import org.redkale.service.Local;
|
import org.redkale.service.Local;
|
||||||
|
import static org.redkale.source.DataSources.*;
|
||||||
import org.redkale.util.*;
|
import org.redkale.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -2570,7 +2569,6 @@ public class DataJdbcSource extends AbstractDataSqlSource {
|
|||||||
listSubSql = "SELECT " + (distinct ? "DISTINCT " : "") + info.getQueryColumns("a", selects) + " FROM "
|
listSubSql = "SELECT " + (distinct ? "DISTINCT " : "") + info.getQueryColumns("a", selects) + " FROM "
|
||||||
+ tables[0] + " a" + joinAndWhere;
|
+ tables[0] + " a" + joinAndWhere;
|
||||||
} else {
|
} else {
|
||||||
int b = 0;
|
|
||||||
for (String table : tables) {
|
for (String table : tables) {
|
||||||
if (union.length() > 0) {
|
if (union.length() > 0) {
|
||||||
union.append(" UNION ALL ");
|
union.append(" UNION ALL ");
|
||||||
@@ -2585,21 +2583,10 @@ public class DataJdbcSource extends AbstractDataSqlSource {
|
|||||||
listSubSql = "SELECT " + (distinct ? "DISTINCT " : "") + info.getQueryColumns("a", selects) + " FROM ("
|
listSubSql = "SELECT " + (distinct ? "DISTINCT " : "") + info.getQueryColumns("a", selects) + " FROM ("
|
||||||
+ (union) + ") a";
|
+ (union) + ") a";
|
||||||
}
|
}
|
||||||
listSql = listSubSql + createSQLOrderby(info, flipper);
|
listSql = listSubSql + createOrderbySql(info, flipper);
|
||||||
if (mysqlOrPgsql) {
|
listSql = createLimitSQL(listSql, flipper);
|
||||||
listSql += (flipper == null || flipper.getLimit() < 1
|
if (readCache && info.isLoggable(logger, Level.FINEST, listSql)) {
|
||||||
? ""
|
logger.finest(info.getType().getSimpleName() + " query sql=" + listSql);
|
||||||
: (" LIMIT " + flipper.getLimit() + " OFFSET " + flipper.getOffset()));
|
|
||||||
if (readCache && info.isLoggable(logger, Level.FINEST, listSql)) {
|
|
||||||
logger.finest(info.getType().getSimpleName() + " query sql=" + listSql);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (readCache && info.isLoggable(logger, Level.FINEST, listSql)) {
|
|
||||||
logger.finest(info.getType().getSimpleName() + " query sql=" + listSql
|
|
||||||
+ (flipper == null || flipper.getLimit() < 1
|
|
||||||
? ""
|
|
||||||
: (" LIMIT " + flipper.getLimit() + " OFFSET " + flipper.getOffset())));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if (mysqlOrPgsql && needTotal) {
|
if (mysqlOrPgsql && needTotal) {
|
||||||
String countSubSql;
|
String countSubSql;
|
||||||
@@ -2840,7 +2827,6 @@ public class DataJdbcSource extends AbstractDataSqlSource {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public <V> Sheet<V> nativeQuerySheet(Class<V> type, String sql, Flipper flipper, Map<String, Object> params) {
|
public <V> Sheet<V> nativeQuerySheet(Class<V> type, String sql, Flipper flipper, Map<String, Object> params) {
|
||||||
final boolean mysqlOrPgsql = "mysql".equals(dbtype()) || "postgresql".equals(dbtype());
|
|
||||||
DataNativeSqlStatement sinfo = super.nativeParse(sql, true, params);
|
DataNativeSqlStatement sinfo = super.nativeParse(sql, true, params);
|
||||||
final long s = System.currentTimeMillis();
|
final long s = System.currentTimeMillis();
|
||||||
final JdbcConnection conn = readPool.pollConnection();
|
final JdbcConnection conn = readPool.pollConnection();
|
||||||
@@ -2876,12 +2862,7 @@ public class DataJdbcSource extends AbstractDataSqlSource {
|
|||||||
}
|
}
|
||||||
slowLog(s, countSql);
|
slowLog(s, countSql);
|
||||||
if (total > 0) {
|
if (total > 0) {
|
||||||
String listSql = sinfo.getNativeSql();
|
String listSql = createLimitSQL(sinfo.getNativeSql(), flipper);
|
||||||
if (mysqlOrPgsql) {
|
|
||||||
listSql += (flipper == null || flipper.getLimit() < 1
|
|
||||||
? ""
|
|
||||||
: (" LIMIT " + flipper.getLimit() + " OFFSET " + flipper.getOffset()));
|
|
||||||
}
|
|
||||||
if (sinfo.isEmptyNamed()) {
|
if (sinfo.isEmptyNamed()) {
|
||||||
Statement stmt = conn.createQueryStatement();
|
Statement stmt = conn.createQueryStatement();
|
||||||
ResultSet set = stmt.executeQuery(listSql);
|
ResultSet set = stmt.executeQuery(listSql);
|
||||||
|
|||||||
@@ -1415,7 +1415,7 @@ public final class EntityInfo<T> {
|
|||||||
* @param flipper 翻页对象
|
* @param flipper 翻页对象
|
||||||
* @return String
|
* @return String
|
||||||
*/
|
*/
|
||||||
protected String createSQLOrderby(Flipper flipper) {
|
protected String createOrderbySql(Flipper flipper) {
|
||||||
if (flipper == null || flipper.getSort() == null) {
|
if (flipper == null || flipper.getSort() == null) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user