diff --git a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/AbstractChainWrapper.java b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/AbstractChainWrapper.java index 2850517e066df4031fe4bce6f759665e817e1389..76f9f8f96f891011d6f05ce1d6e9de78b4429876 100644 --- a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/AbstractChainWrapper.java +++ b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/AbstractChainWrapper.java @@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.core.conditions.interfaces.Func; import com.baomidou.mybatisplus.core.conditions.interfaces.Join; import com.baomidou.mybatisplus.core.conditions.interfaces.Nested; import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils; import java.util.Collection; @@ -237,39 +238,97 @@ public abstract class AbstractChainWrapper columns) { + return doGroupBy(condition, column, columns); } @Override public Children groupBy(boolean condition, R column) { - getWrapper().groupBy(condition, column); - return typedThis; + return doGroupBy(condition, column, null); } @Override public Children groupBy(boolean condition, List columns) { - getWrapper().groupBy(condition, columns); - return typedThis; + return doGroupBy(condition, null, columns); } @Override - public Children orderBy(boolean condition, boolean isAsc, R column, R... columns) { - getWrapper().orderBy(condition, isAsc, column, columns); + @SafeVarargs + public final Children orderBy(boolean condition, boolean isAsc, R column, R... columns) { + return orderBy(condition, isAsc, column, CollectionUtils.toList(columns)); + } + + @Override + public Children orderBy(boolean condition, boolean isAsc, R column, List columns) { + return doOrderBy(condition, isAsc, column, columns); + } + + @Override + @SafeVarargs + public final Children groupBy(R column, R... columns) { + return doGroupBy(true, column, CollectionUtils.toList(columns)); + } + + @Override + @SafeVarargs + public final Children orderByAsc(R column, R... columns) { + return orderByAsc(true, column, columns); + } + + @Override + @SafeVarargs + public final Children orderByAsc(boolean condition, R column, R... columns) { + return doOrderByAsc(condition, column, CollectionUtils.toList(columns)); + } + + @Override + @SafeVarargs + public final Children orderByDesc(boolean condition, R column, R... columns) { + return doOrderByDesc(condition, column, CollectionUtils.toList(columns)); + } + + @Override + @SafeVarargs + public final Children orderByDesc(R column, R... columns) { + return orderByDesc(true, column, columns); + } + + // -------------- 新增重写方法开始---------------- + protected Children doOrderByDesc(boolean condition, R column, List columns) { + return doOrderBy(condition, false, column, columns); + } + + protected Children doOrderByAsc(boolean condition, R column, List columns) { + return doOrderBy(condition, true, column, columns); + } + + protected Children doOrderBy(boolean condition, boolean isAsc, R column, List columns) { + getWrapper().doOrderBy(condition, isAsc, column, columns); + return typedThis; + } + + protected Children doGroupBy(boolean condition, R column, List columns) { + getWrapper().doGroupBy(condition, column, columns); return typedThis; } + + // -------------- 新增重写方法结束---------------- + @Override public Children orderBy(boolean condition, boolean isAsc, R column) { - getWrapper().orderBy(condition, isAsc, column); - return typedThis; + return doOrderBy(condition, isAsc, column, null); } @Override public Children orderBy(boolean condition, boolean isAsc, List columns) { - getWrapper().orderBy(condition, isAsc, columns); - return typedThis; + return doOrderBy(condition, isAsc, null, columns); } @Override diff --git a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/query/LambdaQueryChainWrapper.java b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/query/LambdaQueryChainWrapper.java index 4c49a4a64825e8116b361176ed8a2bdc9ddec43d..08d0bc9944d69505ee00820ef0635713d06b6c30 100644 --- a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/query/LambdaQueryChainWrapper.java +++ b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/query/LambdaQueryChainWrapper.java @@ -19,10 +19,12 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.Query; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.baomidou.mybatisplus.solon.conditions.AbstractChainWrapper; +import java.util.List; import java.util.function.Predicate; /** @@ -59,10 +61,28 @@ public class LambdaQueryChainWrapper extends AbstractChainWrapper(entityClass); } - @SafeVarargs @Override + public LambdaQueryChainWrapper select(boolean condition, List> columns) { + return doSelect(condition, columns); + } + + @Override + @SafeVarargs public final LambdaQueryChainWrapper select(SFunction... columns) { - wrapperChildren.select(columns); + return doSelect(true, CollectionUtils.toList(columns)); + } + + @Override + @SafeVarargs + public final LambdaQueryChainWrapper select(boolean condition, SFunction... columns) { + return doSelect(condition, CollectionUtils.toList(columns)); + } + + /** + * @since 3.5.4 + */ + protected LambdaQueryChainWrapper doSelect(boolean condition, List> columns) { + wrapperChildren.select(condition, columns); return typedThis; } diff --git a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/query/QueryChainWrapper.java b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/query/QueryChainWrapper.java index 472526992141c8c0b6b4c2cc93ca108bfc515b92..905da70a1f9a87ac91d0b948ff291d8a05989bea 100644 --- a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/query/QueryChainWrapper.java +++ b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/query/QueryChainWrapper.java @@ -22,6 +22,7 @@ import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils; import com.baomidou.mybatisplus.solon.conditions.AbstractChainWrapper; +import java.util.List; import java.util.function.Predicate; /** @@ -52,8 +53,8 @@ public class QueryChainWrapper extends AbstractChainWrapper select(String... columns) { - wrapperChildren.select(columns); + public QueryChainWrapper select(boolean condition, List columns) { + wrapperChildren.select(condition, columns); return typedThis; } diff --git a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/update/LambdaUpdateChainWrapper.java b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/update/LambdaUpdateChainWrapper.java index c1d022f6c238b255c811d5975c15de3f1c5869a1..74eb9716c8df59436aa49c8a287a7f08ab645b64 100644 --- a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/update/LambdaUpdateChainWrapper.java +++ b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/update/LambdaUpdateChainWrapper.java @@ -53,8 +53,8 @@ public class LambdaUpdateChainWrapper extends AbstractChainWrapper setSql(boolean condition, String sql) { - wrapperChildren.setSql(condition, sql); + public LambdaUpdateChainWrapper setSql(boolean condition, String setSql, Object... params) { + wrapperChildren.setSql(condition, setSql, params); return typedThis; } diff --git a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/update/UpdateChainWrapper.java b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/update/UpdateChainWrapper.java index 57d4089be315a2c96606d00a5e00b4c7fe011b51..f108288ff3bd050c38c5ee5e5fc9338b7b500f34 100644 --- a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/update/UpdateChainWrapper.java +++ b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/conditions/update/UpdateChainWrapper.java @@ -55,8 +55,8 @@ public class UpdateChainWrapper extends AbstractChainWrapper setSql(boolean condition, String sql) { - wrapperChildren.setSql(condition, sql); + public UpdateChainWrapper setSql(boolean condition, String setSql, Object... params) { + wrapperChildren.setSql(condition, setSql, params); return typedThis; } diff --git a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/injector/methods/InsertBatchSomeColumn.java b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/injector/methods/InsertBatchSomeColumn.java index 1be9d428497df99cc511b44e14327c51629cd753..6dc137647ab33600746b9faf780ebcabc895671f 100644 --- a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/injector/methods/InsertBatchSomeColumn.java +++ b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/injector/methods/InsertBatchSomeColumn.java @@ -60,7 +60,6 @@ import java.util.function.Predicate; * @since 2018-11-29 */ -@SuppressWarnings("serial") public class InsertBatchSomeColumn extends AbstractMethod { /** @@ -103,11 +102,11 @@ public class InsertBatchSomeColumn extends AbstractMethod { KeyGenerator keyGenerator = NoKeyGenerator.INSTANCE; SqlMethod sqlMethod = SqlMethod.INSERT_ONE; List fieldList = tableInfo.getFieldList(); - String insertSqlColumn = tableInfo.getKeyInsertSqlColumn(true, false) + - this.filterTableFieldInfo(fieldList, predicate, TableFieldInfo::getInsertSqlColumn, EMPTY); + String insertSqlColumn = tableInfo.getKeyInsertSqlColumn(true, null, false) + + this.filterTableFieldInfo(fieldList, predicate, TableFieldInfo::getInsertSqlColumn, EMPTY); String columnScript = LEFT_BRACKET + insertSqlColumn.substring(0, insertSqlColumn.length() - 1) + RIGHT_BRACKET; String insertSqlProperty = tableInfo.getKeyInsertSqlProperty(true, ENTITY_DOT, false) + - this.filterTableFieldInfo(fieldList, predicate, i -> i.getInsertSqlProperty(ENTITY_DOT), EMPTY); + this.filterTableFieldInfo(fieldList, predicate, i -> i.getInsertSqlProperty(ENTITY_DOT), EMPTY); insertSqlProperty = LEFT_BRACKET + insertSqlProperty.substring(0, insertSqlProperty.length() - 1) + RIGHT_BRACKET; String valuesScript = SqlScriptUtils.convertForeach(insertSqlProperty, "list", null, ENTITY, COMMA); String keyProperty = null; @@ -129,7 +128,7 @@ public class InsertBatchSomeColumn extends AbstractMethod { } } String sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(), columnScript, valuesScript); - SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); + SqlSource sqlSource = super.createSqlSource(configuration, sql, modelClass); return this.addInsertMappedStatement(mapperClass, modelClass, methodName, sqlSource, keyGenerator, keyProperty, keyColumn); } diff --git a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/inner/BaseMultiTableInnerInterceptor.java b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/inner/BaseMultiTableInnerInterceptor.java index d157936c2d0722245eee494cf6c3aa44b33af25c..60f8d9537087f72752d3da2b8e0bf150049bc37d 100644 --- a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/inner/BaseMultiTableInnerInterceptor.java +++ b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/inner/BaseMultiTableInnerInterceptor.java @@ -283,9 +283,7 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i // 当前 join 的左表 Table leftTable = null; - if (mainTables == null) { - mainTables = new ArrayList<>(); - } else if (mainTables.size() == 1) { + if (mainTables.size() == 1) { mainTable = mainTables.get(0); leftTable = mainTable; } @@ -320,6 +318,7 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i // 如果不要忽略,且是右连接,则记录下当前表 if (join.isRight()) { mainTable = joinTable; + mainTables.clear(); if (leftTable != null) { onTables = Collections.singletonList(leftTable); } @@ -330,12 +329,12 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i onTables = Arrays.asList(mainTable, joinTable); } mainTable = null; + mainTables.clear(); } else { onTables = Collections.singletonList(joinTable); } - mainTables = new ArrayList<>(); - if (mainTable != null) { + if (mainTable != null && !mainTables.contains(mainTable)) { mainTables.add(mainTable); } @@ -346,7 +345,7 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i List onExpressions = new LinkedList<>(); onExpressions.add(builderExpression(originOnExpressions.iterator().next(), onTables, whereSegment)); join.setOnExpressions(onExpressions); - leftTable = joinTable; + leftTable = mainTable == null ? joinTable : mainTable; continue; } // 表名压栈,忽略的表压入 null,以便后续不处理 @@ -384,9 +383,9 @@ public abstract class BaseMultiTableInnerInterceptor extends JsqlParserSupport i } // 构造每张表的条件 List expressions = tables.stream() - .map(item -> buildTableExpression(item, currentExpression, whereSegment)) - .filter(Objects::nonNull) - .collect(Collectors.toList()); + .map(item -> buildTableExpression(item, currentExpression, whereSegment)) + .filter(Objects::nonNull) + .collect(Collectors.toList()); // 没有表需要处理直接返回 if (CollectionUtils.isEmpty(expressions)) { diff --git a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/inner/TenantLineInnerInterceptor.java b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/inner/TenantLineInnerInterceptor.java index 5506c36c446c325f87e8b819e05748555e09bf51..8acd59a39f174bab7d845d9c109980d2838558d9 100644 --- a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/inner/TenantLineInnerInterceptor.java +++ b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/inner/TenantLineInnerInterceptor.java @@ -21,6 +21,8 @@ import com.baomidou.mybatisplus.solon.plugins.handler.TenantLineHandler; import com.baomidou.mybatisplus.solon.toolkit.PropertyMapper; import lombok.*; import net.sf.jsqlparser.expression.Expression; +import net.sf.jsqlparser.expression.Parenthesis; +import net.sf.jsqlparser.expression.RowConstructor; import net.sf.jsqlparser.expression.StringValue; import net.sf.jsqlparser.expression.operators.relational.EqualsTo; import net.sf.jsqlparser.expression.operators.relational.ExpressionList; @@ -32,6 +34,7 @@ import net.sf.jsqlparser.statement.delete.Delete; import net.sf.jsqlparser.statement.insert.Insert; import net.sf.jsqlparser.statement.select.*; import net.sf.jsqlparser.statement.update.Update; +import net.sf.jsqlparser.statement.update.UpdateSet; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.executor.statement.StatementHandler; import org.apache.ibatis.mapping.BoundSql; @@ -42,6 +45,7 @@ import org.apache.ibatis.session.RowBounds; import java.sql.Connection; import java.sql.SQLException; +import java.util.ArrayList; import java.util.List; import java.util.Properties; @@ -120,7 +124,7 @@ public class TenantLineInnerInterceptor extends BaseMultiTableInnerInterceptor i } Select select = insert.getSelect(); - if (select != null) { + if (select != null && (select.getSelectBody() instanceof PlainSelect)) { //fix github issue 4998 修复升级到4.5版本的问题 this.processInsertSelect(select.getSelectBody(), (String) obj); } else if (insert.getItemsList() != null) { // fixed github pull/295 @@ -129,7 +133,26 @@ public class TenantLineInnerInterceptor extends BaseMultiTableInnerInterceptor i if (itemsList instanceof MultiExpressionList) { ((MultiExpressionList) itemsList).getExpressionLists().forEach(el -> el.getExpressions().add(tenantId)); } else { - ((ExpressionList) itemsList).getExpressions().add(tenantId); + List expressions = ((ExpressionList) itemsList).getExpressions(); + if (CollectionUtils.isNotEmpty(expressions)) {//fix github issue 4998 jsqlparse 4.5 批量insert ItemsList不是MultiExpressionList 了,需要特殊处理 + int len = expressions.size(); + for (int i = 0; i < len; i++) { + Expression expression = expressions.get(i); + if (expression instanceof RowConstructor) { + ((RowConstructor) expression).getExprList().getExpressions().add(tenantId); + } else if (expression instanceof Parenthesis) { + RowConstructor rowConstructor = new RowConstructor() + .withExprList(new ExpressionList(((Parenthesis) expression).getExpression(), tenantId)); + expressions.set(i, rowConstructor); + } else { + if (len - 1 == i) { // (?,?) 只有最后一个expre的时候才拼接tenantId + expressions.add(tenantId); + } + } + } + } else { + expressions.add(tenantId); + } } } else { throw ExceptionUtils.mpe("Failed to process multiple-table update, please exclude the tableName or statementId"); @@ -146,6 +169,14 @@ public class TenantLineInnerInterceptor extends BaseMultiTableInnerInterceptor i // 过滤退出执行 return; } + ArrayList sets = update.getUpdateSets(); + if (!CollectionUtils.isEmpty(sets)) { + sets.forEach(us -> us.getExpressions().forEach(ex -> { + if (ex instanceof SubSelect) { + processSelectBody(((SubSelect) ex).getSelectBody(), (String) obj); + } + })); + } update.setWhere(this.andExpression(table, update.getWhere(), (String) obj)); } diff --git a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/pagination/DialectFactory.java b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/pagination/DialectFactory.java index 09ca585f139c78c037924b6ec2f33790c293a0e5..699039052903862ec88d2f7e7aa5c51e477de800 100644 --- a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/pagination/DialectFactory.java +++ b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/pagination/DialectFactory.java @@ -39,44 +39,46 @@ public class DialectFactory { } // mysql same type else if (dbType == DbType.MYSQL - || dbType == DbType.MARIADB - || dbType == DbType.GBASE - || dbType == DbType.OSCAR - || dbType == DbType.XU_GU - || dbType == DbType.CLICK_HOUSE - || dbType == DbType.OCEAN_BASE - || dbType == DbType.CUBRID - || dbType == DbType.GOLDILOCKS - || dbType == DbType.CSIIDB) { + || dbType == DbType.MARIADB + || dbType == DbType.GBASE + || dbType == DbType.OSCAR + || dbType == DbType.XU_GU + || dbType == DbType.CLICK_HOUSE + || dbType == DbType.OCEAN_BASE + || dbType == DbType.CUBRID + || dbType == DbType.SUNDB) { dialect = new MySqlDialect(); } // oracle same type else if (dbType == DbType.ORACLE - || dbType == DbType.DM - || dbType == DbType.GAUSS) { + || dbType == DbType.DM + || dbType == DbType.GAUSS) { dialect = new OracleDialect(); } // postgresql same type else if (dbType == DbType.POSTGRE_SQL - || dbType == DbType.H2 - || dbType == DbType.SQLITE - || dbType == DbType.HSQL - || dbType == DbType.KINGBASE_ES - || dbType == DbType.PHOENIX - || dbType == DbType.SAP_HANA - || dbType == DbType.IMPALA - || dbType == DbType.HIGH_GO - || dbType == DbType.VERTICA - || dbType == DbType.REDSHIFT - || dbType == DbType.OPENGAUSS - || dbType == DbType.TDENGINE - || dbType == DbType.UXDB) { + || dbType == DbType.H2 + || dbType == DbType.LEALONE + || dbType == DbType.SQLITE + || dbType == DbType.HSQL + || dbType == DbType.KINGBASE_ES + || dbType == DbType.PHOENIX + || dbType == DbType.SAP_HANA + || dbType == DbType.IMPALA + || dbType == DbType.HIGH_GO + || dbType == DbType.VERTICA + || dbType == DbType.REDSHIFT + || dbType == DbType.OPENGAUSS + || dbType == DbType.TDENGINE + || dbType == DbType.UXDB + || dbType == DbType.GBASE8S_PG + || dbType == DbType.GBASE_8C) { dialect = new PostgreDialect(); } // other types else if (dbType == DbType.ORACLE_12C - || dbType == DbType.FIREBIRD - || dbType == DbType.SQL_SERVER) { + || dbType == DbType.FIREBIRD + || dbType == DbType.SQL_SERVER) { dialect = new Oracle12cDialect(); } else if (dbType == DbType.DB2) { dialect = new DB2Dialect(); @@ -84,20 +86,18 @@ public class DialectFactory { dialect = new SQLServer2005Dialect(); } else if (dbType == DbType.SYBASE) { dialect = new SybaseDialect(); - } else if (dbType == DbType.GBASEDBT) { - dialect = new GBasedbtDialect(); - } else if (dbType == DbType.GBASE_INFORMIX) { - dialect = new GBaseInfromixDialect(); } else if (dbType == DbType.XCloud) { dialect = new XCloudDialect(); - } else if (dbType == DbType.FIREBIRD) { - dialect = new FirebirdDialect(); } else if (dbType == DbType.GBASE_8S - || dbType == DbType.GBASEDBT - || dbType == DbType.GBASE_INFORMIX) { + || dbType == DbType.GBASEDBT + || dbType == DbType.GBASE_INFORMIX + || dbType == DbType.SINODB) { dialect = new GBase8sDialect(); - }else if(dbType==DbType.INFORMIX){ + } else if (dbType == DbType.INFORMIX) { dialect = new InformixDialect(); + } else if (dbType == DbType.TRINO + || dbType == DbType.PRESTO) { + dialect = new TrinoDialect(); } DIALECT_ENUM_MAP.put(dbType, dialect); } diff --git a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/pagination/dialects/TrinoDialect.java b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/pagination/dialects/TrinoDialect.java new file mode 100644 index 0000000000000000000000000000000000000000..7938ccc7b46e40a093839e407cdd62be97582246 --- /dev/null +++ b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/pagination/dialects/TrinoDialect.java @@ -0,0 +1,25 @@ +package com.baomidou.mybatisplus.solon.plugins.pagination.dialects; + +import com.baomidou.mybatisplus.solon.plugins.pagination.DialectModel; + +/** + * Trino 数据库分页语句组装实现 + * + * @author hushunbo + * @since 2023-10-06 + */ +public class TrinoDialect implements IDialect { + + @Override + public DialectModel buildPaginationSql(String originalSql, long offset, long limit) { + StringBuilder sql = new StringBuilder(originalSql); + if (offset != 0L) { + sql.append(" OFFSET ").append(FIRST_MARK); + sql.append(" LIMIT ").append(SECOND_MARK); + return new DialectModel(sql.toString(), offset, limit).setConsumerChain(); + } else { + sql.append(" LIMIT ").append(FIRST_MARK); + return new DialectModel(sql.toString(), limit).setConsumer(true); + } + } +} diff --git a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/pagination/optimize/JsqlParserCountOptimize.java b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/pagination/optimize/JsqlParserCountOptimize.java deleted file mode 100644 index ca8dca0ce02f86155ff0319db00c4abeb749134e..0000000000000000000000000000000000000000 --- a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/pagination/optimize/JsqlParserCountOptimize.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (c) 2011-2022, baomidou (jobob@qq.com). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.baomidou.mybatisplus.solon.plugins.pagination.optimize; - -import com.baomidou.mybatisplus.core.parser.ISqlParser; -import com.baomidou.mybatisplus.core.parser.SqlInfo; -import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.baomidou.mybatisplus.core.toolkit.StringPool; -import com.baomidou.mybatisplus.solon.toolkit.SqlParserUtils; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; -import net.sf.jsqlparser.expression.Alias; -import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.expression.Function; -import net.sf.jsqlparser.expression.LongValue; -import net.sf.jsqlparser.expression.operators.relational.ExpressionList; -import net.sf.jsqlparser.parser.CCJSqlParserUtil; -import net.sf.jsqlparser.schema.Table; -import net.sf.jsqlparser.statement.select.*; -import org.apache.ibatis.logging.Log; -import org.apache.ibatis.logging.LogFactory; -import org.apache.ibatis.reflection.MetaObject; - -import java.util.Collections; -import java.util.List; -import java.util.Optional; - -/** - * JsqlParser Count Optimize - * - * @author hubin - * @since 2017-06-20 - * @deprecated 2022-05-31 - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -@Deprecated -public class JsqlParserCountOptimize implements ISqlParser { - private static final List COUNT_SELECT_ITEM = Collections.singletonList(defaultCountSelectItem()); - private final Log logger = LogFactory.getLog(JsqlParserCountOptimize.class); - - private boolean optimizeJoin = false; - - /** - * 获取jsqlparser中count的SelectItem - */ - private static SelectItem defaultCountSelectItem() { - Function function = new Function(); - ExpressionList expressionList = new ExpressionList(Collections.singletonList(new LongValue(1))); - function.setName("COUNT"); - function.setParameters(expressionList); - return new SelectExpressionItem(function); - } - - @Override - public SqlInfo parser(MetaObject metaObject, String sql) { - if (logger.isDebugEnabled()) { - logger.debug("JsqlParserCountOptimize sql=" + sql); - } - SqlInfo sqlInfo = SqlInfo.newInstance(); - try { - Select selectStatement = (Select) CCJSqlParserUtil.parse(sql); - PlainSelect plainSelect = (PlainSelect) selectStatement.getSelectBody(); - Distinct distinct = plainSelect.getDistinct(); - GroupByElement groupBy = plainSelect.getGroupBy(); - List orderBy = plainSelect.getOrderByElements(); - - // 添加包含groupBy 不去除orderBy - if (null == groupBy && CollectionUtils.isNotEmpty(orderBy)) { - plainSelect.setOrderByElements(null); - sqlInfo.setOrderBy(false); - } - //#95 Github, selectItems contains #{} ${}, which will be translated to ?, and it may be in a function: power(#{myInt},2) - for (SelectItem item : plainSelect.getSelectItems()) { - if (item.toString().contains(StringPool.QUESTION_MARK)) { - return sqlInfo.setSql(SqlParserUtils.getOriginalCountSql(selectStatement.toString())); - } - } - // 包含 distinct、groupBy不优化 - if (distinct != null || null != groupBy) { - return sqlInfo.setSql(SqlParserUtils.getOriginalCountSql(selectStatement.toString())); - } - // 包含 join 连表,进行判断是否移除 join 连表 - List joins = plainSelect.getJoins(); - if (optimizeJoin && CollectionUtils.isNotEmpty(joins)) { - boolean canRemoveJoin = true; - String whereS = Optional.ofNullable(plainSelect.getWhere()).map(Expression::toString).orElse(StringPool.EMPTY); - // 不区分大小写 - whereS = whereS.toLowerCase(); - for (Join join : joins) { - if (!join.isLeft()) { - canRemoveJoin = false; - break; - } - Table table = (Table) join.getRightItem(); - String str = Optional.ofNullable(table.getAlias()).map(Alias::getName).orElse(table.getName()) + StringPool.DOT; - // 不区分大小写 - str = str.toLowerCase(); - String onExpressionS = join.getOnExpression().toString(); - /* 如果 join 里包含 ?(代表有入参) 或者 where 条件里包含使用 join 的表的字段作条件,就不移除 join */ - if (onExpressionS.contains(StringPool.QUESTION_MARK) || whereS.contains(str)) { - canRemoveJoin = false; - break; - } - } - if (canRemoveJoin) { - plainSelect.setJoins(null); - } - } - // 优化 SQL - plainSelect.setSelectItems(COUNT_SELECT_ITEM); - return sqlInfo.setSql(selectStatement.toString()); - } catch (Throwable e) { - // 无法优化使用原 SQL - return sqlInfo.setSql(SqlParserUtils.getOriginalCountSql(sql)); - } - } -} diff --git a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/pagination/optimize/package-info.java b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/pagination/optimize/package-info.java deleted file mode 100644 index b9bdd82f55106dfb4e69516a84fb7df5f273deaf..0000000000000000000000000000000000000000 --- a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/plugins/pagination/optimize/package-info.java +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright (c) 2011-2022, baomidou (jobob@qq.com). - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * COUNT SQL 优化相关类 - */ -package com.baomidou.mybatisplus.solon.plugins.pagination.optimize; diff --git a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/toolkit/JdbcUtils.java b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/toolkit/JdbcUtils.java index 5cfb4636fc0ec6ecd839bc324b43c4041223c18d..030826a4efc6f07fadf2dd7d73de6e36a992e86d 100644 --- a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/toolkit/JdbcUtils.java +++ b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/main/java/com/baomidou/mybatisplus/solon/toolkit/JdbcUtils.java @@ -85,6 +85,8 @@ public class JdbcUtils { return DbType.SQLITE; } else if (url.contains(":h2:")) { return DbType.H2; + } else if (url.contains(":lealone:")) { + return DbType.LEALONE; } else if (regexFind(":dm\\d*:", url)) { return DbType.DM; } else if (url.contains(":xugu:")) { @@ -99,6 +101,10 @@ public class JdbcUtils { return DbType.GBASE; } else if (url.contains(":gbasedbt-sqli:") || url.contains(":informix-sqli:")) { return DbType.GBASE_8S; + } else if (url.contains(":gbase8s-pg:")) { + return DbType.GBASE8S_PG; + } else if (url.contains(":gbase8c:")) { + return DbType.GBASE_8C; } else if (url.contains(":ch:") || url.contains(":clickhouse:")) { return DbType.CLICK_HOUSE; } else if (url.contains(":oscar:")) { @@ -111,10 +117,8 @@ public class JdbcUtils { return DbType.HIGH_GO; } else if (url.contains(":cubrid:")) { return DbType.CUBRID; - } else if (url.contains(":goldilocks:")) { - return DbType.GOLDILOCKS; - } else if (url.contains(":csiidb:")) { - return DbType.CSIIDB; + } else if (url.contains(":sundb:")) { + return DbType.SUNDB; } else if (url.contains(":sap:")) { return DbType.SAP_HANA; } else if (url.contains(":impala:")) { @@ -133,8 +137,14 @@ public class JdbcUtils { return DbType.TDENGINE; } else if (url.contains(":informix")) { return DbType.INFORMIX; + } else if (url.contains(":sinodb")) { + return DbType.SINODB; } else if (url.contains(":uxdb:")) { return DbType.UXDB; + } else if (url.contains(":trino:")) { + return DbType.TRINO; + } else if (url.contains(":presto:")) { + return DbType.PRESTO; } else { logger.warn("The jdbcUrl is " + jdbcUrl + ", Mybatis Plus Cannot Read Database type or The Database's Not Supported!"); return DbType.OTHER; diff --git a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/test/java/com/baomidou/mybatisplus/solon/plugins/inner/TenantLineInnerInterceptorTest.java b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/test/java/com/baomidou/mybatisplus/solon/plugins/inner/TenantLineInnerInterceptorTest.java index fa6f73cba022cd646fb4aff470550e6622bb352c..93591bffbc03b385370bd8e632d9148300768977 100644 --- a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/test/java/com/baomidou/mybatisplus/solon/plugins/inner/TenantLineInnerInterceptorTest.java +++ b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/test/java/com/baomidou/mybatisplus/solon/plugins/inner/TenantLineInnerInterceptorTest.java @@ -38,288 +38,303 @@ class TenantLineInnerInterceptorTest { @Test void insert() { // plain - assertSql("insert into entity (id,name) value (?,?)", - "INSERT INTO entity (id, name, tenant_id) VALUES (?, ?, 1)"); + assertSql("insert into entity (id) values (?)", + "INSERT INTO entity (id, tenant_id) VALUES (?, 1)"); + assertSql("insert into entity (id,name) values (?,?)", + "INSERT INTO entity (id, name, tenant_id) VALUES (?, ?, 1)"); + // batch + assertSql("insert into entity (id) values (?),(?)", + "INSERT INTO entity (id, tenant_id) VALUES (?, 1), (?, 1)"); + assertSql("insert into entity (id,name) values (?,?),(?,?)", + "INSERT INTO entity (id, name, tenant_id) VALUES (?, ?, 1), (?, ?, 1)"); // 无 insert的列 assertSql("insert into entity value (?,?)", - "INSERT INTO entity VALUES (?, ?)"); + "INSERT INTO entity VALUES (?, ?)"); // 自己加了insert的列 assertSql("insert into entity (id,name,tenant_id) value (?,?,?)", - "INSERT INTO entity (id, name, tenant_id) VALUES (?, ?, ?)"); + "INSERT INTO entity (id, name, tenant_id) VALUES (?, ?, ?)"); // insert into select assertSql("insert into entity (id,name) select id,name from entity2", - "INSERT INTO entity (id, name, tenant_id) SELECT id, name, tenant_id FROM entity2 WHERE entity2.tenant_id = 1"); + "INSERT INTO entity (id, name, tenant_id) SELECT id, name, tenant_id FROM entity2 WHERE tenant_id = 1"); - assertSql("insert into entity (id,name) select * from entity2", - "INSERT INTO entity (id, name, tenant_id) SELECT * FROM entity2 WHERE entity2.tenant_id = 1"); + assertSql("insert into entity (id,name) select * from entity2 e2", + "INSERT INTO entity (id, name, tenant_id) SELECT * FROM entity2 e2 WHERE e2.tenant_id = 1"); - assertSql("insert into entity (id,name) select id,name from (select id,name from entity3) t", - "INSERT INTO entity (id, name, tenant_id) SELECT id, name, tenant_id FROM (SELECT id, name, tenant_id FROM entity3 WHERE entity3.tenant_id = 1) t"); + assertSql("insert into entity (id,name) select id,name from (select id,name from entity3 e3) t", + "INSERT INTO entity (id, name, tenant_id) SELECT id, name, tenant_id FROM (SELECT id, name, tenant_id FROM entity3 e3 WHERE e3.tenant_id = 1) t"); - assertSql("insert into entity (id,name) select * from (select id,name from entity3) t", - "INSERT INTO entity (id, name, tenant_id) SELECT * FROM (SELECT id, name, tenant_id FROM entity3 WHERE entity3.tenant_id = 1) t"); + assertSql("insert into entity (id,name) select * from (select id,name from entity3 e3) t", + "INSERT INTO entity (id, name, tenant_id) SELECT * FROM (SELECT id, name, tenant_id FROM entity3 e3 WHERE e3.tenant_id = 1) t"); - assertSql("insert into entity (id,name) select t.* from (select id,name from entity3) t", - "INSERT INTO entity (id, name, tenant_id) SELECT t.* FROM (SELECT id, name, tenant_id FROM entity3 WHERE entity3.tenant_id = 1) t"); + assertSql("insert into entity (id,name) select t.* from (select id,name from entity3 e3) t", + "INSERT INTO entity (id, name, tenant_id) SELECT t.* FROM (SELECT id, name, tenant_id FROM entity3 e3 WHERE e3.tenant_id = 1) t"); } @Test void delete() { assertSql("delete from entity where id = ?", - "DELETE FROM entity WHERE entity.tenant_id = 1 AND id = ?"); + "DELETE FROM entity WHERE id = ? AND tenant_id = 1"); } @Test void update() { assertSql("update entity set name = ? where id = ?", - "UPDATE entity SET name = ? WHERE entity.tenant_id = 1 AND id = ?"); + "UPDATE entity SET name = ? WHERE id = ? AND tenant_id = 1"); + + // set subSelect + assertSql("UPDATE entity e SET e.cq = (SELECT e1.total FROM entity e1 WHERE e1.id = ?) WHERE e.id = ?", + "UPDATE entity e SET e.cq = (SELECT e1.total FROM entity e1 WHERE e1.id = ? AND e1.tenant_id = 1) " + + "WHERE e.id = ? AND e.tenant_id = 1"); } @Test void selectSingle() { // 单表 assertSql("select * from entity where id = ?", - "SELECT * FROM entity WHERE id = ? AND entity.tenant_id = 1"); + "SELECT * FROM entity WHERE id = ? AND tenant_id = 1"); assertSql("select * from entity where id = ? or name = ?", - "SELECT * FROM entity WHERE (id = ? OR name = ?) AND entity.tenant_id = 1"); + "SELECT * FROM entity WHERE (id = ? OR name = ?) AND tenant_id = 1"); assertSql("SELECT * FROM entity WHERE (id = ? OR name = ?)", - "SELECT * FROM entity WHERE (id = ? OR name = ?) AND entity.tenant_id = 1"); + "SELECT * FROM entity WHERE (id = ? OR name = ?) AND tenant_id = 1"); /* not */ assertSql("SELECT * FROM entity WHERE not (id = ? OR name = ?)", - "SELECT * FROM entity WHERE NOT (id = ? OR name = ?) AND entity.tenant_id = 1"); + "SELECT * FROM entity WHERE NOT (id = ? OR name = ?) AND tenant_id = 1"); + + assertSql("SELECT * FROM entity u WHERE not (u.id = ? OR u.name = ?)", + "SELECT * FROM entity u WHERE NOT (u.id = ? OR u.name = ?) AND u.tenant_id = 1"); } @Test void selectSubSelectIn() { /* in */ assertSql("SELECT * FROM entity e WHERE e.id IN (select e1.id from entity1 e1 where e1.id = ?)", - "SELECT * FROM entity e WHERE e.id IN (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); + "SELECT * FROM entity e WHERE e.id IN (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); // 在最前 assertSql("SELECT * FROM entity e WHERE e.id IN " + - "(select e1.id from entity1 e1 where e1.id = ?) and e.id = ?", - "SELECT * FROM entity e WHERE e.id IN " + - "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ? AND e.tenant_id = 1"); + "(select e1.id from entity1 e1 where e1.id = ?) and e.id = ?", + "SELECT * FROM entity e WHERE e.id IN " + + "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ? AND e.tenant_id = 1"); // 在最后 assertSql("SELECT * FROM entity e WHERE e.id = ? and e.id IN " + - "(select e1.id from entity1 e1 where e1.id = ?)", - "SELECT * FROM entity e WHERE e.id = ? AND e.id IN " + - "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); + "(select e1.id from entity1 e1 where e1.id = ?)", + "SELECT * FROM entity e WHERE e.id = ? AND e.id IN " + + "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); // 在中间 assertSql("SELECT * FROM entity e WHERE e.id = ? and e.id IN " + - "(select e1.id from entity1 e1 where e1.id = ?) and e.id = ?", - "SELECT * FROM entity e WHERE e.id = ? AND e.id IN " + - "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ? AND e.tenant_id = 1"); + "(select e1.id from entity1 e1 where e1.id = ?) and e.id = ?", + "SELECT * FROM entity e WHERE e.id = ? AND e.id IN " + + "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ? AND e.tenant_id = 1"); } @Test void selectSubSelectEq() { /* = */ assertSql("SELECT * FROM entity e WHERE e.id = (select e1.id from entity1 e1 where e1.id = ?)", - "SELECT * FROM entity e WHERE e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); + "SELECT * FROM entity e WHERE e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); } @Test void selectSubSelectInnerNotEq() { /* inner not = */ assertSql("SELECT * FROM entity e WHERE not (e.id = (select e1.id from entity1 e1 where e1.id = ?))", - "SELECT * FROM entity e WHERE NOT (e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1)) AND e.tenant_id = 1"); + "SELECT * FROM entity e WHERE NOT (e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1)) AND e.tenant_id = 1"); assertSql("SELECT * FROM entity e WHERE not (e.id = (select e1.id from entity1 e1 where e1.id = ?) and e.id = ?)", - "SELECT * FROM entity e WHERE NOT (e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ?) AND e.tenant_id = 1"); + "SELECT * FROM entity e WHERE NOT (e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ?) AND e.tenant_id = 1"); } @Test void selectSubSelectExists() { /* EXISTS */ assertSql("SELECT * FROM entity e WHERE EXISTS (select e1.id from entity1 e1 where e1.id = ?)", - "SELECT * FROM entity e WHERE EXISTS (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); + "SELECT * FROM entity e WHERE EXISTS (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); /* NOT EXISTS */ assertSql("SELECT * FROM entity e WHERE NOT EXISTS (select e1.id from entity1 e1 where e1.id = ?)", - "SELECT * FROM entity e WHERE NOT EXISTS (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); + "SELECT * FROM entity e WHERE NOT EXISTS (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); } @Test void selectSubSelect() { /* >= */ assertSql("SELECT * FROM entity e WHERE e.id >= (select e1.id from entity1 e1 where e1.id = ?)", - "SELECT * FROM entity e WHERE e.id >= (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); + "SELECT * FROM entity e WHERE e.id >= (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); /* <= */ assertSql("SELECT * FROM entity e WHERE e.id <= (select e1.id from entity1 e1 where e1.id = ?)", - "SELECT * FROM entity e WHERE e.id <= (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); + "SELECT * FROM entity e WHERE e.id <= (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); /* <> */ assertSql("SELECT * FROM entity e WHERE e.id <> (select e1.id from entity1 e1 where e1.id = ?)", - "SELECT * FROM entity e WHERE e.id <> (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); + "SELECT * FROM entity e WHERE e.id <> (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1"); } @Test void selectFromSelect() { assertSql("SELECT * FROM (select e.id from entity e WHERE e.id = (select e1.id from entity1 e1 where e1.id = ?))", - "SELECT * FROM (SELECT e.id FROM entity e WHERE e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1)"); + "SELECT * FROM (SELECT e.id FROM entity e WHERE e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1)"); } @Test void selectBodySubSelect() { assertSql("select t1.col1,(select t2.col2 from t2 t2 where t1.col1=t2.col1) from t1 t1", - "SELECT t1.col1, (SELECT t2.col2 FROM t2 t2 WHERE t1.col1 = t2.col1 AND t2.tenant_id = 1) FROM t1 t1 WHERE t1.tenant_id = 1"); + "SELECT t1.col1, (SELECT t2.col2 FROM t2 t2 WHERE t1.col1 = t2.col1 AND t2.tenant_id = 1) FROM t1 t1 WHERE t1.tenant_id = 1"); } @Test void selectLeftJoin() { // left join assertSql("SELECT * FROM entity e " + - "left join entity1 e1 on e1.id = e.id " + - "WHERE e.id = ? OR e.name = ?", - "SELECT * FROM entity e " + - "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " + - "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1"); + "left join entity1 e1 on e1.id = e.id " + + "WHERE e.id = ? OR e.name = ?", + "SELECT * FROM entity e " + + "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " + + "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1"); assertSql("SELECT * FROM entity e " + - "left join entity1 e1 on e1.id = e.id " + - "WHERE (e.id = ? OR e.name = ?)", - "SELECT * FROM entity e " + - "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " + - "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1"); + "left join entity1 e1 on e1.id = e.id " + + "WHERE (e.id = ? OR e.name = ?)", + "SELECT * FROM entity e " + + "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " + + "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1"); assertSql("SELECT * FROM entity e " + - "left join entity1 e1 on e1.id = e.id " + - "left join entity2 e2 on e1.id = e2.id", - "SELECT * FROM entity e " + - "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " + - "LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1 " + - "WHERE e.tenant_id = 1"); + "left join entity1 e1 on e1.id = e.id " + + "left join entity2 e2 on e1.id = e2.id", + "SELECT * FROM entity e " + + "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " + + "LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1 " + + "WHERE e.tenant_id = 1"); } @Test void selectRightJoin() { // right join assertSql("SELECT * FROM entity e " + - "right join entity1 e1 on e1.id = e.id", - "SELECT * FROM entity e " + - "RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 " + - "WHERE e1.tenant_id = 1"); + "right join entity1 e1 on e1.id = e.id", + "SELECT * FROM entity e " + + "RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 " + + "WHERE e1.tenant_id = 1"); assertSql("SELECT * FROM with_as_1 e " + - "right join entity1 e1 on e1.id = e.id", - "SELECT * FROM with_as_1 e " + - "RIGHT JOIN entity1 e1 ON e1.id = e.id " + - "WHERE e1.tenant_id = 1"); + "right join entity1 e1 on e1.id = e.id", + "SELECT * FROM with_as_1 e " + + "RIGHT JOIN entity1 e1 ON e1.id = e.id " + + "WHERE e1.tenant_id = 1"); assertSql("SELECT * FROM entity e " + - "right join entity1 e1 on e1.id = e.id " + - "WHERE e.id = ? OR e.name = ?", - "SELECT * FROM entity e " + - "RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 " + - "WHERE (e.id = ? OR e.name = ?) AND e1.tenant_id = 1"); + "right join entity1 e1 on e1.id = e.id " + + "WHERE e.id = ? OR e.name = ?", + "SELECT * FROM entity e " + + "RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 " + + "WHERE (e.id = ? OR e.name = ?) AND e1.tenant_id = 1"); assertSql("SELECT * FROM entity e " + - "right join entity1 e1 on e1.id = e.id " + - "right join entity2 e2 on e1.id = e2.id ", - "SELECT * FROM entity e " + - "RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 " + - "RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e1.tenant_id = 1 " + - "WHERE e2.tenant_id = 1"); + "right join entity1 e1 on e1.id = e.id " + + "right join entity2 e2 on e1.id = e2.id ", + "SELECT * FROM entity e " + + "RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 " + + "RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e1.tenant_id = 1 " + + "WHERE e2.tenant_id = 1"); } @Test void selectMixJoin() { assertSql("SELECT * FROM entity e " + - "right join entity1 e1 on e1.id = e.id " + - "left join entity2 e2 on e1.id = e2.id", - "SELECT * FROM entity e " + - "RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 " + - "LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1 " + - "WHERE e1.tenant_id = 1"); + "right join entity1 e1 on e1.id = e.id " + + "left join entity2 e2 on e1.id = e2.id", + "SELECT * FROM entity e " + + "RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 " + + "LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1 " + + "WHERE e1.tenant_id = 1"); assertSql("SELECT * FROM entity e " + - "left join entity1 e1 on e1.id = e.id " + - "right join entity2 e2 on e1.id = e2.id", - "SELECT * FROM entity e " + - "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " + - "RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e1.tenant_id = 1 " + - "WHERE e2.tenant_id = 1"); + "left join entity1 e1 on e1.id = e.id " + + "right join entity2 e2 on e1.id = e2.id", + "SELECT * FROM entity e " + + "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " + + "RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e.tenant_id = 1 " + + "WHERE e2.tenant_id = 1"); assertSql("SELECT * FROM entity e " + - "left join entity1 e1 on e1.id = e.id " + - "inner join entity2 e2 on e1.id = e2.id", - "SELECT * FROM entity e " + - "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " + - "INNER JOIN entity2 e2 ON e1.id = e2.id AND e.tenant_id = 1 AND e2.tenant_id = 1"); + "left join entity1 e1 on e1.id = e.id " + + "inner join entity2 e2 on e1.id = e2.id", + "SELECT * FROM entity e " + + "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " + + "INNER JOIN entity2 e2 ON e1.id = e2.id AND e.tenant_id = 1 AND e2.tenant_id = 1"); } @Test void selectJoinSubSelect() { - assertSql("select * from (select * from entity) e1 " + - "left join entity2 e2 on e1.id = e2.id", - "SELECT * FROM (SELECT * FROM entity WHERE entity.tenant_id = 1) e1 " + - "LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1"); + assertSql("select * from (select * from entity e) e1 " + + "left join entity2 e2 on e1.id = e2.id", + "SELECT * FROM (SELECT * FROM entity e WHERE e.tenant_id = 1) e1 " + + "LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1"); assertSql("select * from entity1 e1 " + - "left join (select * from entity2) e2 " + - "on e1.id = e2.id", - "SELECT * FROM entity1 e1 " + - "LEFT JOIN (SELECT * FROM entity2 WHERE entity2.tenant_id = 1) e2 " + - "ON e1.id = e2.id " + - "WHERE e1.tenant_id = 1"); + "left join (select * from entity2 e2) e22 " + + "on e1.id = e22.id", + "SELECT * FROM entity1 e1 " + + "LEFT JOIN (SELECT * FROM entity2 e2 WHERE e2.tenant_id = 1) e22 " + + "ON e1.id = e22.id " + + "WHERE e1.tenant_id = 1"); } @Test void selectSubJoin() { assertSql("select * FROM " + - "(entity1 e1 right JOIN entity2 e2 ON e1.id = e2.id)", - "SELECT * FROM " + - "(entity1 e1 RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e1.tenant_id = 1) " + - "WHERE e2.tenant_id = 1"); + "(entity1 e1 right JOIN entity2 e2 ON e1.id = e2.id)", + "SELECT * FROM " + + "(entity1 e1 RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e1.tenant_id = 1) " + + "WHERE e2.tenant_id = 1"); assertSql("select * FROM " + - "(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id)", - "SELECT * FROM " + - "(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) " + - "WHERE e1.tenant_id = 1"); + "(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id)", + "SELECT * FROM " + + "(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) " + + "WHERE e1.tenant_id = 1"); assertSql("select * FROM " + - "(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id) " + - "right join entity3 e3 on e1.id = e3.id", - "SELECT * FROM " + - "(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) " + - "RIGHT JOIN entity3 e3 ON e1.id = e3.id AND e1.tenant_id = 1 " + - "WHERE e3.tenant_id = 1"); + "(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id) " + + "right join entity3 e3 on e1.id = e3.id", + "SELECT * FROM " + + "(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) " + + "RIGHT JOIN entity3 e3 ON e1.id = e3.id AND e1.tenant_id = 1 " + + "WHERE e3.tenant_id = 1"); assertSql("select * FROM entity e " + - "LEFT JOIN (entity1 e1 right join entity2 e2 ON e1.id = e2.id) " + - "on e.id = e2.id", - "SELECT * FROM entity e " + - "LEFT JOIN (entity1 e1 RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e1.tenant_id = 1) " + - "ON e.id = e2.id AND e2.tenant_id = 1 " + - "WHERE e.tenant_id = 1"); + "LEFT JOIN (entity1 e1 right join entity2 e2 ON e1.id = e2.id) " + + "on e.id = e2.id", + "SELECT * FROM entity e " + + "LEFT JOIN (entity1 e1 RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e1.tenant_id = 1) " + + "ON e.id = e2.id AND e2.tenant_id = 1 " + + "WHERE e.tenant_id = 1"); assertSql("select * FROM entity e " + - "LEFT JOIN (entity1 e1 left join entity2 e2 ON e1.id = e2.id) " + - "on e.id = e2.id", - "SELECT * FROM entity e " + - "LEFT JOIN (entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) " + - "ON e.id = e2.id AND e1.tenant_id = 1 " + - "WHERE e.tenant_id = 1"); + "LEFT JOIN (entity1 e1 left join entity2 e2 ON e1.id = e2.id) " + + "on e.id = e2.id", + "SELECT * FROM entity e " + + "LEFT JOIN (entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) " + + "ON e.id = e2.id AND e1.tenant_id = 1 " + + "WHERE e.tenant_id = 1"); assertSql("select * FROM entity e " + - "RIGHT JOIN (entity1 e1 left join entity2 e2 ON e1.id = e2.id) " + - "on e.id = e2.id", - "SELECT * FROM entity e " + - "RIGHT JOIN (entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) " + - "ON e.id = e2.id AND e.tenant_id = 1 " + - "WHERE e1.tenant_id = 1"); + "RIGHT JOIN (entity1 e1 left join entity2 e2 ON e1.id = e2.id) " + + "on e.id = e2.id", + "SELECT * FROM entity e " + + "RIGHT JOIN (entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) " + + "ON e.id = e2.id AND e.tenant_id = 1 " + + "WHERE e1.tenant_id = 1"); } @@ -327,102 +342,125 @@ class TenantLineInnerInterceptorTest { void selectLeftJoinMultipleTrailingOn() { // 多个 on 尾缀的 assertSql("SELECT * FROM entity e " + - "LEFT JOIN entity1 e1 " + - "LEFT JOIN entity2 e2 ON e2.id = e1.id " + - "ON e1.id = e.id " + - "WHERE (e.id = ? OR e.NAME = ?)", - "SELECT * FROM entity e " + - "LEFT JOIN entity1 e1 " + - "LEFT JOIN entity2 e2 ON e2.id = e1.id AND e2.tenant_id = 1 " + - "ON e1.id = e.id AND e1.tenant_id = 1 " + - "WHERE (e.id = ? OR e.NAME = ?) AND e.tenant_id = 1"); + "LEFT JOIN entity1 e1 " + + "LEFT JOIN entity2 e2 ON e2.id = e1.id " + + "ON e1.id = e.id " + + "WHERE (e.id = ? OR e.NAME = ?)", + "SELECT * FROM entity e " + + "LEFT JOIN entity1 e1 " + + "LEFT JOIN entity2 e2 ON e2.id = e1.id AND e2.tenant_id = 1 " + + "ON e1.id = e.id AND e1.tenant_id = 1 " + + "WHERE (e.id = ? OR e.NAME = ?) AND e.tenant_id = 1"); assertSql("SELECT * FROM entity e " + - "LEFT JOIN entity1 e1 " + - "LEFT JOIN with_as_A e2 ON e2.id = e1.id " + - "ON e1.id = e.id " + - "WHERE (e.id = ? OR e.NAME = ?)", - "SELECT * FROM entity e " + - "LEFT JOIN entity1 e1 " + - "LEFT JOIN with_as_A e2 ON e2.id = e1.id " + - "ON e1.id = e.id AND e1.tenant_id = 1 " + - "WHERE (e.id = ? OR e.NAME = ?) AND e.tenant_id = 1"); + "LEFT JOIN entity1 e1 " + + "LEFT JOIN with_as_A e2 ON e2.id = e1.id " + + "ON e1.id = e.id " + + "WHERE (e.id = ? OR e.NAME = ?)", + "SELECT * FROM entity e " + + "LEFT JOIN entity1 e1 " + + "LEFT JOIN with_as_A e2 ON e2.id = e1.id " + + "ON e1.id = e.id AND e1.tenant_id = 1 " + + "WHERE (e.id = ? OR e.NAME = ?) AND e.tenant_id = 1"); } @Test void selectInnerJoin() { // inner join assertSql("SELECT * FROM entity e " + - "inner join entity1 e1 on e1.id = e.id " + - "WHERE e.id = ? OR e.name = ?", - "SELECT * FROM entity e " + - "INNER JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 AND e1.tenant_id = 1 " + - "WHERE e.id = ? OR e.name = ?"); + "inner join entity1 e1 on e1.id = e.id " + + "WHERE e.id = ? OR e.name = ?", + "SELECT * FROM entity e " + + "INNER JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 AND e1.tenant_id = 1 " + + "WHERE e.id = ? OR e.name = ?"); assertSql("SELECT * FROM entity e " + - "inner join entity1 e1 on e1.id = e.id " + - "WHERE (e.id = ? OR e.name = ?)", - "SELECT * FROM entity e " + - "INNER JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 AND e1.tenant_id = 1 " + - "WHERE (e.id = ? OR e.name = ?)"); + "inner join entity1 e1 on e1.id = e.id " + + "WHERE (e.id = ? OR e.name = ?)", + "SELECT * FROM entity e " + + "INNER JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 AND e1.tenant_id = 1 " + + "WHERE (e.id = ? OR e.name = ?)"); // 隐式内连接 - assertSql("SELECT * FROM entity,entity1 " + - "WHERE entity.id = entity1.id", - "SELECT * FROM entity, entity1 " + - "WHERE entity.id = entity1.id AND entity.tenant_id = 1 AND entity1.tenant_id = 1"); + assertSql("SELECT * FROM entity e,entity1 e1 " + + "WHERE e.id = e1.id", + "SELECT * FROM entity e, entity1 e1 " + + "WHERE e.id = e1.id AND e.tenant_id = 1 AND e1.tenant_id = 1"); // 隐式内连接 assertSql("SELECT * FROM entity a, with_as_entity1 b " + - "WHERE a.id = b.id", - "SELECT * FROM entity a, with_as_entity1 b " + - "WHERE a.id = b.id AND a.tenant_id = 1"); + "WHERE a.id = b.id", + "SELECT * FROM entity a, with_as_entity1 b " + + "WHERE a.id = b.id AND a.tenant_id = 1"); assertSql("SELECT * FROM with_as_entity a, with_as_entity1 b " + - "WHERE a.id = b.id", - "SELECT * FROM with_as_entity a, with_as_entity1 b " + - "WHERE a.id = b.id"); + "WHERE a.id = b.id", + "SELECT * FROM with_as_entity a, with_as_entity1 b " + + "WHERE a.id = b.id"); // SubJoin with 隐式内连接 - assertSql("SELECT * FROM (entity,entity1) " + - "WHERE entity.id = entity1.id", - "SELECT * FROM (entity, entity1) " + - "WHERE entity.id = entity1.id " + - "AND entity.tenant_id = 1 AND entity1.tenant_id = 1"); - - assertSql("SELECT * FROM ((entity,entity1),entity2) " + - "WHERE entity.id = entity1.id and entity.id = entity2.id", - "SELECT * FROM ((entity, entity1), entity2) " + - "WHERE entity.id = entity1.id AND entity.id = entity2.id " + - "AND entity.tenant_id = 1 AND entity1.tenant_id = 1 AND entity2.tenant_id = 1"); - - assertSql("SELECT * FROM (entity,(entity1,entity2)) " + - "WHERE entity.id = entity1.id and entity.id = entity2.id", - "SELECT * FROM (entity, (entity1, entity2)) " + - "WHERE entity.id = entity1.id AND entity.id = entity2.id " + - "AND entity.tenant_id = 1 AND entity1.tenant_id = 1 AND entity2.tenant_id = 1"); + assertSql("SELECT * FROM (entity e,entity1 e1) " + + "WHERE e.id = e1.id", + "SELECT * FROM (entity e, entity1 e1) " + + "WHERE e.id = e1.id " + + "AND e.tenant_id = 1 AND e1.tenant_id = 1"); + + assertSql("SELECT * FROM ((entity e,entity1 e1),entity2 e2) " + + "WHERE e.id = e1.id and e.id = e2.id", + "SELECT * FROM ((entity e, entity1 e1), entity2 e2) " + + "WHERE e.id = e1.id AND e.id = e2.id " + + "AND e.tenant_id = 1 AND e1.tenant_id = 1 AND e2.tenant_id = 1"); + + assertSql("SELECT * FROM (entity e,(entity1 e1,entity2 e2)) " + + "WHERE e.id = e1.id and e.id = e2.id", + "SELECT * FROM (entity e, (entity1 e1, entity2 e2)) " + + "WHERE e.id = e1.id AND e.id = e2.id " + + "AND e.tenant_id = 1 AND e1.tenant_id = 1 AND e2.tenant_id = 1"); // 沙雕的括号写法 - assertSql("SELECT * FROM (((entity,entity1))) " + - "WHERE entity.id = entity1.id", - "SELECT * FROM (((entity, entity1))) " + - "WHERE entity.id = entity1.id " + - "AND entity.tenant_id = 1 AND entity1.tenant_id = 1"); + assertSql("SELECT * FROM (((entity e,entity1 e1))) " + + "WHERE e.id = e1.id", + "SELECT * FROM (((entity e, entity1 e1))) " + + "WHERE e.id = e1.id " + + "AND e.tenant_id = 1 AND e1.tenant_id = 1"); } + @Test + void selectJoin() { + // join + assertSql("SELECT * FROM entity e join entity1 e1 on e1.id = e.id WHERE e.id = ? OR e.name = ?", + "SELECT * FROM entity e JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1"); + + assertSql("SELECT * FROM entity e join entity1 e1 on e1.id = e.id WHERE (e.id = ? OR e.name = ?)", + "SELECT * FROM entity e JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1"); + } @Test void selectWithAs() { assertSql("with with_as_A as (select * from entity) select * from with_as_A", - "WITH with_as_A AS (SELECT * FROM entity WHERE entity.tenant_id = 1) SELECT * FROM with_as_A"); + "WITH with_as_A AS (SELECT * FROM entity WHERE tenant_id = 1) SELECT * FROM with_as_A"); } @Test void selectIgnoreTable() { assertSql(" SELECT dict.dict_code, item.item_text AS \"text\", item.item_value AS \"value\" FROM sys_dict_item item INNER JOIN sys_dict dict ON dict.id = item.dict_id WHERE dict.dict_code IN (1, 2, 3) AND item.item_value IN (1, 2, 3)", - "SELECT dict.dict_code, item.item_text AS \"text\", item.item_value AS \"value\" FROM sys_dict_item item INNER JOIN sys_dict dict ON dict.id = item.dict_id AND item.tenant_id = 1 WHERE dict.dict_code IN (1, 2, 3) AND item.item_value IN (1, 2, 3)"); + "SELECT dict.dict_code, item.item_text AS \"text\", item.item_value AS \"value\" FROM sys_dict_item item INNER JOIN sys_dict dict ON dict.id = item.dict_id AND item.tenant_id = 1 WHERE dict.dict_code IN (1, 2, 3) AND item.item_value IN (1, 2, 3)"); + } + + @Test + void test6() { + // 不显式指定 JOIN 类型时 JOIN 右侧表无法识进行拼接条件(在未改动之前就已经有这个问题) + assertSql("select u.username from sys_user u join sys_user_role r on u.id=r.user_id", + "SELECT u.username FROM sys_user u JOIN sys_user_role r ON u.id = r.user_id AND r.tenant_id = 1 WHERE u.tenant_id = 1"); + } + + @Test + void test7() { + // 显式指定 JOIN 类型时 JOIN 右侧表才能进行拼接条件 + assertSql("select u.username from sys_user u LEFT join sys_user_role r on u.id=r.user_id", + "SELECT u.username FROM sys_user u LEFT JOIN sys_user_role r ON u.id = r.user_id AND r.tenant_id = 1 WHERE u.tenant_id = 1"); } void assertSql(String sql, String targetSql) { diff --git a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/test/java/com/baomidou/mybatisplus/test/plugins/pagination/optimize/JsqlParserCountOptimizeTest.java b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/test/java/com/baomidou/mybatisplus/test/plugins/pagination/optimize/JsqlParserCountOptimizeTest.java deleted file mode 100644 index 49251c01724732042aeacd7ec7fea9811fbf703f..0000000000000000000000000000000000000000 --- a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/test/java/com/baomidou/mybatisplus/test/plugins/pagination/optimize/JsqlParserCountOptimizeTest.java +++ /dev/null @@ -1,134 +0,0 @@ -package com.baomidou.mybatisplus.test.plugins.pagination.optimize; - -import com.baomidou.mybatisplus.core.parser.SqlInfo; -import com.baomidou.mybatisplus.solon.plugins.pagination.optimize.JsqlParserCountOptimize; -import com.github.pagehelper.parser.CountSqlParser; -import org.apache.ibatis.reflection.MetaObject; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author miemie - * @since 2019-05-08 - */ -class JsqlParserCountOptimizeTest { - - private JsqlParserCountOptimize parser = new JsqlParserCountOptimize(true); - private MetaObject metaObject = null; - - @Test - void parserLeftJoin() { - /* 能进行优化的 SQL */ - assertThat(parser.parser(metaObject, "select * from user u LEFT JOIN role r ON r.id = u.role_id WHERE u.xx = ?").getSql()) - .isEqualTo("SELECT COUNT(1) FROM user u WHERE u.xx = ?"); - - assertThat(parser.parser(metaObject, "select * from user LEFT JOIN role ON role.id = user.role_id WHERE user.xx = ?").getSql()) - .isEqualTo("SELECT COUNT(1) FROM user WHERE user.xx = ?"); - - /* 不能进行优化的 SQL */ - assertThat(parser.parser(metaObject, "select * from user u LEFT JOIN role r ON r.id = u.role_id AND r.name = ? where u.xx = ?").getSql()) - .isEqualTo("SELECT COUNT(1) FROM user u LEFT JOIN role r ON r.id = u.role_id AND r.name = ? WHERE u.xx = ?"); - - /* join 表与 where 条件大小写不同的情况 */ - assertThat(parser.parser(metaObject, "select * from user u LEFT JOIN role r ON r.id = u.role_id where R.NAME = ?").getSql()) - .isEqualTo("SELECT COUNT(1) FROM user u LEFT JOIN role r ON r.id = u.role_id WHERE R.NAME = ?"); - - assertThat(parser.parser(metaObject, "select * from user u LEFT JOIN role r ON r.id = u.role_id WHERE u.xax = ? AND r.cc = ? AND r.qq = ?").getSql()) - .isEqualTo("SELECT COUNT(1) FROM user u LEFT JOIN role r ON r.id = u.role_id WHERE u.xax = ? AND r.cc = ? AND r.qq = ?"); - - /* 复杂sql */ - - SqlInfo parser = this.parser.parser(metaObject, "select\n" + - "IF(guideScenicSpotId IS NULL,voiceScenicSpotId,guideScenicSpotId) AS scenicSpotId,\n" + - "IF(guideStatisticalDate IS NULL,voiceStatisticalDate,guideStatisticalDate) AS statisticalDate,\n" + - "t.*\n" + - "from (\n" + - "SELECT g.scenicSpotId AS guideScenicSpotId,\n" + - " g.orderType AS guideOrderType,\n" + - " g.orderNum AS guideOrderNum,\n" + - " g.totalGetAmount AS guideTotalGetAmount,\n" + - " g.refundNum AS guideRefundNum,\n" + - " g.totalRefundAmount AS guideTotalRefundAmount,\n" + - " g.statisticalDate AS guideStatisticalDate,\n" + - " v.scenicSpotId AS voiceScenicSpotId,\n" + - " v.orderType AS voiceOrderType,\n" + - " v.orderNum AS voiceOrderNum,\n" + - " v.totalGetAmount AS voiceTotalGetAmount,\n" + - " v.refundNum AS voiceRefundNum,\n" + - " v.totalRefundAmount AS voiceTotalRefundAmount,\n" + - " v.statisticalDate AS voiceStatisticalDate\n" + - " FROM `v_guideOrder_day` g LEFT JOIN `v_voiceOrder_day` v ON g.`scenicSpotId` = v.`scenicSpotId`" + - " AND g.`statisticalDate` = v.`statisticalDate`\n" + - " UNION ALL\n" + - " SELECT g.scenicSpotId AS guideScenicSpotId,\n" + - " g.orderType AS guideOrderType,\n" + - " g.orderNum AS guideOrderNum,\n" + - " g.totalGetAmount AS guideTotalGetAmount,\n" + - " g.refundNum AS guideRefundNum,\n" + - " g.totalRefundAmount AS guideTotalRefundAmount,\n" + - " g.statisticalDate AS guideStatisticalDate,\n" + - " v.scenicSpotId AS voiceScenicSpotId,\n" + - " v.orderType AS voiceOrderType,\n" + - " v.orderNum AS voiceOrderNum,\n" + - " v.totalGetAmount AS voiceTotalGetAmount,\n" + - " v.refundNum AS voiceRefundNum,\n" + - " v.totalRefundAmount AS voiceTotalRefundAmount,\n" + - " v.statisticalDate AS voiceStatisticalDate\n" + - " FROM `v_guideOrder_day` g\n" + - " RIGHT JOIN `v_voiceOrder_day` v\n" + - " ON g.`scenicSpotId` = v.`scenicSpotId` AND\n" + - " g.`statisticalDate` = v.`statisticalDate`\n" + - " ) t\n" + - " where 1=1"); - System.out.println(parser.getSql()); - } - - @Test - void pageHelper() { - CountSqlParser parser = new CountSqlParser(); - String sql = parser.getSimpleCountSql("select\n" + - "IF(guideScenicSpotId IS NULL,voiceScenicSpotId,guideScenicSpotId) AS scenicSpotId,\n" + - "IF(guideStatisticalDate IS NULL,voiceStatisticalDate,guideStatisticalDate) AS statisticalDate,\n" + - "t.*\n" + - "from (\n" + - "SELECT g.scenicSpotId AS guideScenicSpotId,\n" + - " g.orderType AS guideOrderType,\n" + - " g.orderNum AS guideOrderNum,\n" + - " g.totalGetAmount AS guideTotalGetAmount,\n" + - " g.refundNum AS guideRefundNum,\n" + - " g.totalRefundAmount AS guideTotalRefundAmount,\n" + - " g.statisticalDate AS guideStatisticalDate,\n" + - " v.scenicSpotId AS voiceScenicSpotId,\n" + - " v.orderType AS voiceOrderType,\n" + - " v.orderNum AS voiceOrderNum,\n" + - " v.totalGetAmount AS voiceTotalGetAmount,\n" + - " v.refundNum AS voiceRefundNum,\n" + - " v.totalRefundAmount AS voiceTotalRefundAmount,\n" + - " v.statisticalDate AS voiceStatisticalDate\n" + - " FROM `v_guideOrder_day` g LEFT JOIN `v_voiceOrder_day` v ON g.`scenicSpotId` = v.`scenicSpotId`" + - " AND g.`statisticalDate` = v.`statisticalDate`\n" + - " UNION ALL\n" + - " SELECT g.scenicSpotId AS guideScenicSpotId,\n" + - " g.orderType AS guideOrderType,\n" + - " g.orderNum AS guideOrderNum,\n" + - " g.totalGetAmount AS guideTotalGetAmount,\n" + - " g.refundNum AS guideRefundNum,\n" + - " g.totalRefundAmount AS guideTotalRefundAmount,\n" + - " g.statisticalDate AS guideStatisticalDate,\n" + - " v.scenicSpotId AS voiceScenicSpotId,\n" + - " v.orderType AS voiceOrderType,\n" + - " v.orderNum AS voiceOrderNum,\n" + - " v.totalGetAmount AS voiceTotalGetAmount,\n" + - " v.refundNum AS voiceRefundNum,\n" + - " v.totalRefundAmount AS voiceTotalRefundAmount,\n" + - " v.statisticalDate AS voiceStatisticalDate\n" + - " FROM `v_guideOrder_day` g\n" + - " RIGHT JOIN `v_voiceOrder_day` v\n" + - " ON g.`scenicSpotId` = v.`scenicSpotId` AND\n" + - " g.`statisticalDate` = v.`statisticalDate`\n" + - " ) t\n" + - " where 1=1"); - System.out.println(sql); - } -} diff --git a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/test/java/com/baomidou/mybatisplus/test/pom/GeneratePomTest.java b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/test/java/com/baomidou/mybatisplus/test/pom/GeneratePomTest.java index 947825b28bac81cca0d876b12ad86dc2f4ac92d3..510d570a271c3aa38087cd48ea91e1d94f1985d4 100644 --- a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/test/java/com/baomidou/mybatisplus/test/pom/GeneratePomTest.java +++ b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-extension-solon-plugin/src/test/java/com/baomidou/mybatisplus/test/pom/GeneratePomTest.java @@ -47,7 +47,7 @@ class GeneratePomTest { @Test void test() throws IOException { - try (InputStream inputStream = new FileInputStream("build/publications/mavenJava/pom-default.xml");) { + try (InputStream inputStream = new FileInputStream("build/publications/mavenJava/pom-default.xml")) { JerryParser jerryParser = Jerry.create(new LagartoDOMBuilder().enableXmlMode()); Jerry doc = jerryParser.parse(FileUtil.readUTFString(inputStream)); Jerry dependencies = doc.s("dependencies dependency"); @@ -56,27 +56,18 @@ class GeneratePomTest { String artifactId = $this.s("artifactId").text(); dependenciesMap.put(artifactId, new Dependency(artifactId, $this.s("scope").text(), Boolean.parseBoolean($this.s("optional").text()))); }); - Dependency core = dependenciesMap.get("mybatis-plus-core"); - Assertions.assertEquals("compile", core.getScope()); - Assertions.assertFalse(core.isOptional()); - Dependency mybatisSpring = dependenciesMap.get("mybatis-spring"); - Assertions.assertEquals("compile", mybatisSpring.getScope()); - Assertions.assertFalse(mybatisSpring.isOptional()); - Dependency kotlinStdlib = dependenciesMap.get("kotlin-stdlib-jdk8"); - Assertions.assertEquals("compile", kotlinStdlib.getScope()); - Assertions.assertTrue(kotlinStdlib.isOptional()); - Dependency kotlinReflect = dependenciesMap.get("kotlin-reflect"); - Assertions.assertEquals("compile", kotlinReflect.getScope()); - Assertions.assertTrue(kotlinReflect.isOptional()); - Dependency support = dependenciesMap.get("spring-context-support"); - Assertions.assertEquals("compile", support.getScope()); - Assertions.assertTrue(support.isOptional()); - Dependency jdbc = dependenciesMap.get("spring-jdbc"); - Assertions.assertEquals("compile", jdbc.getScope()); - Assertions.assertTrue(jdbc.isOptional()); - Dependency slf4jApi = dependenciesMap.get("slf4j-api"); - Assertions.assertEquals("compile", slf4jApi.getScope()); - Assertions.assertTrue(slf4jApi.isOptional()); + Dependency annotation = dependenciesMap.get("mybatis-plus-annotation"); + Assertions.assertEquals("compile", annotation.getScope()); + Assertions.assertFalse(annotation.isOptional()); + Dependency mybatis = dependenciesMap.get("mybatis"); + Assertions.assertEquals("compile", mybatis.getScope()); + Assertions.assertFalse(mybatis.isOptional()); + Dependency jsqlParser = dependenciesMap.get("jsqlparser"); + Assertions.assertEquals("compile", jsqlParser.getScope()); + Assertions.assertFalse(jsqlParser.isOptional()); + Dependency cglib = dependenciesMap.get("cglib"); + Assertions.assertEquals("compile", cglib.getScope()); + Assertions.assertTrue(cglib.isOptional()); } } diff --git a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-solon-plugin/pom.xml b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-solon-plugin/pom.xml index 67aad26c590d8134e49c6ec8a52a61d09706abb7..5dbff4c6ab1b402638de8820ee1522316478d670 100644 --- a/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-solon-plugin/pom.xml +++ b/solon-integration-projects/solon-plugin-data-sql/mybatis-plus-solon-plugin/pom.xml @@ -24,7 +24,7 @@ com.baomidou mybatis-plus-core - 3.5.3.1 + 3.5.5 org.mybatis @@ -60,4 +60,4 @@ - \ No newline at end of file +