fixed: #I7HVXT

This commit is contained in:
开源海哥 2023-07-04 15:58:21 +08:00
parent 8245e55dce
commit dffc0eb568
8 changed files with 121 additions and 33 deletions

View File

@ -318,20 +318,16 @@ public class CommonsDialectImpl implements IDialect {
public String buildSelectSql(QueryWrapper queryWrapper) { public String buildSelectSql(QueryWrapper queryWrapper) {
List<QueryTable> queryTables = CPI.getQueryTables(queryWrapper); List<QueryTable> queryTables = CPI.getQueryTables(queryWrapper);
if (CollectionUtil.isEmpty(queryTables)) {
throw FlexExceptions.wrap("QueryWrapper must use the 'FROM' clause to select the table.");
}
List<QueryTable> joinTables = CPI.getJoinTables(queryWrapper); List<QueryTable> joinTables = CPI.getJoinTables(queryWrapper);
List<QueryTable> allTables = CollectionUtil.merge(queryTables, joinTables); List<QueryTable> allTables = CollectionUtil.merge(queryTables, joinTables);
List<QueryColumn> selectColumns = CPI.getSelectColumns(queryWrapper); List<QueryColumn> selectColumns = CPI.getSelectColumns(queryWrapper);
int queryTablesCount = queryTables.size(); int queryTablesCount = queryTables == null ? 0 : queryTables.size();
int joinTablesCount = joinTables != null ? joinTables.size() : 0; int joinTablesCount = joinTables != null ? joinTables.size() : 0;
//多表查询时自动映射 //多表查询时自动映射
if (queryTablesCount + joinTablesCount > 1) { if (queryTablesCount > 0 && queryTablesCount + joinTablesCount > 1) {
QueryTable firstTable = queryTables.get(0); QueryTable firstTable = queryTables.get(0);
if (!(firstTable instanceof SelectQueryTable)) { if (!(firstTable instanceof SelectQueryTable)) {
TableInfo tableInfo = TableInfoFactory.ofTableName(firstTable.getName()); TableInfo tableInfo = TableInfoFactory.ofTableName(firstTable.getName());
@ -374,7 +370,7 @@ public class CommonsDialectImpl implements IDialect {
buildOrderBySql(sqlBuilder, queryWrapper, allTables); buildOrderBySql(sqlBuilder, queryWrapper, allTables);
List<UnionWrapper> unions = CPI.getUnions(queryWrapper); List<UnionWrapper> unions = CPI.getUnions(queryWrapper);
if (CollectionUtil.isNotEmpty(unions)) { if (!CollectionUtil.isEmpty(unions)) {
sqlBuilder.insert(0, BRACKET_LEFT).append(BRACKET_RIGHT); sqlBuilder.insert(0, BRACKET_LEFT).append(BRACKET_RIGHT);
for (UnionWrapper unionWrapper : unions) { for (UnionWrapper unionWrapper : unions) {
unionWrapper.buildSql(sqlBuilder, this); unionWrapper.buildSql(sqlBuilder, this);
@ -388,7 +384,7 @@ public class CommonsDialectImpl implements IDialect {
} }
List<String> endFragments = CPI.getEndFragments(queryWrapper); List<String> endFragments = CPI.getEndFragments(queryWrapper);
if (CollectionUtil.isNotEmpty(endFragments)) { if (!CollectionUtil.isEmpty(endFragments)) {
for (String endFragment : endFragments) { for (String endFragment : endFragments) {
sqlBuilder.append(BLANK).append(endFragment); sqlBuilder.append(BLANK).append(endFragment);
} }
@ -408,7 +404,7 @@ public class CommonsDialectImpl implements IDialect {
buildOrderBySql(sqlBuilder, queryWrapper, Collections.EMPTY_LIST); buildOrderBySql(sqlBuilder, queryWrapper, Collections.EMPTY_LIST);
List<UnionWrapper> unions = CPI.getUnions(queryWrapper); List<UnionWrapper> unions = CPI.getUnions(queryWrapper);
if (CollectionUtil.isNotEmpty(unions)) { if (!CollectionUtil.isEmpty(unions)) {
if (sqlBuilder.length() > 0) { if (sqlBuilder.length() > 0) {
sqlBuilder.insert(0, BRACKET_LEFT).append(BRACKET_RIGHT); sqlBuilder.insert(0, BRACKET_LEFT).append(BRACKET_RIGHT);
} }
@ -424,7 +420,7 @@ public class CommonsDialectImpl implements IDialect {
} }
List<String> endFragments = CPI.getEndFragments(queryWrapper); List<String> endFragments = CPI.getEndFragments(queryWrapper);
if (CollectionUtil.isNotEmpty(endFragments)) { if (!CollectionUtil.isEmpty(endFragments)) {
for (String endFragment : endFragments) { for (String endFragment : endFragments) {
sqlBuilder.append(BLANK).append(endFragment); sqlBuilder.append(BLANK).append(endFragment);
} }
@ -476,7 +472,7 @@ public class CommonsDialectImpl implements IDialect {
//buildLimitSql(sqlBuilder, queryWrapper) //buildLimitSql(sqlBuilder, queryWrapper)
List<String> endFragments = CPI.getEndFragments(queryWrapper); List<String> endFragments = CPI.getEndFragments(queryWrapper);
if (CollectionUtil.isNotEmpty(endFragments)) { if (!CollectionUtil.isEmpty(endFragments)) {
for (String endFragment : endFragments) { for (String endFragment : endFragments) {
sqlBuilder.append(BLANK).append(endFragment); sqlBuilder.append(BLANK).append(endFragment);
} }
@ -833,7 +829,7 @@ public class CommonsDialectImpl implements IDialect {
sql.append(WHERE).append(whereConditionSql); sql.append(WHERE).append(whereConditionSql);
List<String> endFragments = CPI.getEndFragments(queryWrapper); List<String> endFragments = CPI.getEndFragments(queryWrapper);
if (CollectionUtil.isNotEmpty(endFragments)) { if (!CollectionUtil.isEmpty(endFragments)) {
for (String endFragment : endFragments) { for (String endFragment : endFragments) {
sql.append(BLANK).append(endFragment); sql.append(BLANK).append(endFragment);
} }
@ -863,7 +859,7 @@ public class CommonsDialectImpl implements IDialect {
sql.append(WHERE).append(whereConditionSql); sql.append(WHERE).append(whereConditionSql);
List<String> endFragments = CPI.getEndFragments(queryWrapper); List<String> endFragments = CPI.getEndFragments(queryWrapper);
if (CollectionUtil.isNotEmpty(endFragments)) { if (!CollectionUtil.isEmpty(endFragments)) {
for (String endFragment : endFragments) { for (String endFragment : endFragments) {
sql.append(BLANK).append(endFragment); sql.append(BLANK).append(endFragment);
} }

View File

@ -364,13 +364,7 @@ public class EntitySqlProvider {
public static String selectListByQuery(Map params, ProviderContext context) { public static String selectListByQuery(Map params, ProviderContext context) {
QueryWrapper queryWrapper = ProviderUtil.getQueryWrapper(params); QueryWrapper queryWrapper = ProviderUtil.getQueryWrapper(params);
List<TableInfo> tableInfos = getTableInfos(context, queryWrapper); appendTableConditions(context, queryWrapper, true);
for (TableInfo tableInfo : tableInfos) {
tableInfo.appendConditions(null, queryWrapper);
CPI.setSelectColumnsIfNecessary(queryWrapper, tableInfo.getDefaultQueryColumn());
CPI.setFromIfNecessary(queryWrapper, tableInfo.getSchema(), tableInfo.getTableName());
}
//优先构建 sql再构建参数 //优先构建 sql再构建参数
String sql = DialectFactory.getDialect().forSelectByQuery(queryWrapper); String sql = DialectFactory.getDialect().forSelectByQuery(queryWrapper);
@ -381,6 +375,7 @@ public class EntitySqlProvider {
return sql; return sql;
} }
/** /**
* selectCountByQuery sql 构建 * selectCountByQuery sql 构建
* *
@ -392,12 +387,7 @@ public class EntitySqlProvider {
public static String selectObjectByQuery(Map params, ProviderContext context) { public static String selectObjectByQuery(Map params, ProviderContext context) {
QueryWrapper queryWrapper = ProviderUtil.getQueryWrapper(params); QueryWrapper queryWrapper = ProviderUtil.getQueryWrapper(params);
List<TableInfo> tableInfos = getTableInfos(context, queryWrapper); appendTableConditions(context, queryWrapper, false);
for (TableInfo tableInfo : tableInfos) {
tableInfo.appendConditions(null, queryWrapper);
CPI.setFromIfNecessary(queryWrapper, tableInfo.getSchema(), tableInfo.getTableName());
}
//优先构建 sql再构建参数 //优先构建 sql再构建参数
String sql = DialectFactory.getDialect().forSelectByQuery(queryWrapper); String sql = DialectFactory.getDialect().forSelectByQuery(queryWrapper);
@ -409,10 +399,31 @@ public class EntitySqlProvider {
} }
private static void appendTableConditions(ProviderContext context, QueryWrapper queryWrapper, boolean setSelectColumns) {
List<TableInfo> tableInfos = getTableInfos(context, queryWrapper);
if (!CollectionUtil.isEmpty(tableInfos)) {
for (TableInfo tableInfo : tableInfos) {
tableInfo.appendConditions(null, queryWrapper);
if (setSelectColumns) {
CPI.setSelectColumnsIfNecessary(queryWrapper, tableInfo.getDefaultQueryColumn());
}
CPI.setFromIfNecessary(queryWrapper, tableInfo.getSchema(), tableInfo.getTableName());
}
} else {
List<QueryWrapper> childQueryWrappers = CPI.getChildSelect(queryWrapper);
if (!CollectionUtil.isEmpty(childQueryWrappers)) {
for (QueryWrapper childQueryWrapper : childQueryWrappers) {
appendTableConditions(context, childQueryWrapper, setSelectColumns);
}
}
}
}
private static List<TableInfo> getTableInfos(ProviderContext context, QueryWrapper queryWrapper) { private static List<TableInfo> getTableInfos(ProviderContext context, QueryWrapper queryWrapper) {
List<TableInfo> tableInfos; List<TableInfo> tableInfos;
List<QueryTable> queryTables = CPI.getQueryTables(queryWrapper); List<QueryTable> queryTables = CPI.getQueryTables(queryWrapper);
if (CollectionUtil.isNotEmpty(queryTables)) { if (!CollectionUtil.isEmpty(queryTables)) {
tableInfos = new ArrayList<>(); tableInfos = new ArrayList<>();
for (QueryTable queryTable : queryTables) { for (QueryTable queryTable : queryTables) {
String tableNameWithSchema = queryTable.getNameWithSchema(); String tableNameWithSchema = queryTable.getNameWithSchema();

View File

@ -232,7 +232,7 @@ public class CPI {
return selectQueryColumn.getQueryWrapper(); return selectQueryColumn.getQueryWrapper();
} }
public static boolean isSameTable(QueryTable queryTable,QueryTable otherTable){ public static boolean isSameTable(QueryTable queryTable, QueryTable otherTable) {
return queryTable.isSameTable(otherTable); return queryTable.isSameTable(otherTable);
} }
} }

View File

@ -690,14 +690,31 @@ public class QueryWrapper extends BaseQueryWrapper<QueryWrapper> {
List<QueryWrapper> getChildSelect() { List<QueryWrapper> getChildSelect() {
List<QueryWrapper> tableChildQuery = null;
List<QueryTable> queryTables = getQueryTables();
if (CollectionUtil.isNotEmpty(queryTables)) {
for (QueryTable queryTable : queryTables) {
if (queryTable instanceof SelectQueryTable) {
if (tableChildQuery == null) {
tableChildQuery = new ArrayList<>();
}
tableChildQuery.add(((SelectQueryTable) queryTable).getQueryWrapper());
}
}
}
List<QueryWrapper> whereChildQuery = WrapperUtil.getChildQueryWrapper(whereQueryCondition); List<QueryWrapper> whereChildQuery = WrapperUtil.getChildQueryWrapper(whereQueryCondition);
List<QueryWrapper> havingChildQuery = WrapperUtil.getChildQueryWrapper(havingQueryCondition); List<QueryWrapper> havingChildQuery = WrapperUtil.getChildQueryWrapper(havingQueryCondition);
if (whereChildQuery.isEmpty() && havingChildQuery.isEmpty()) { if (tableChildQuery == null && whereChildQuery.isEmpty() && havingChildQuery.isEmpty()) {
return Collections.emptyList(); return Collections.emptyList();
} }
List<QueryWrapper> childQueryWrappers = new ArrayList<>(whereChildQuery);
List<QueryWrapper> childQueryWrappers = tableChildQuery == null
? new ArrayList<>() : new ArrayList<>(tableChildQuery);
childQueryWrappers.addAll(whereChildQuery);
childQueryWrappers.addAll(havingChildQuery); childQueryWrappers.addAll(havingChildQuery);
return childQueryWrappers; return childQueryWrappers;

View File

@ -31,7 +31,6 @@ public class CollectionUtil {
return collection == null || collection.isEmpty(); return collection == null || collection.isEmpty();
} }
public static boolean isNotEmpty(Collection<?> collection) { public static boolean isNotEmpty(Collection<?> collection) {
return !isEmpty(collection); return !isEmpty(collection);
} }
@ -41,7 +40,6 @@ public class CollectionUtil {
return map == null || map.isEmpty(); return map == null || map.isEmpty();
} }
public static boolean isNotEmpty(Map<?, ?> map) { public static boolean isNotEmpty(Map<?, ?> map) {
return !isEmpty(map); return !isEmpty(map);
} }

View File

@ -197,7 +197,7 @@ public class MapperUtil {
"Expected one result (or null) to be returned by selectOne(), but found: " + size); "Expected one result (or null) to be returned by selectOne(), but found: " + size);
} }
public static long getLongNumber(List<Object> objects,QueryWrapper queryWrapper){ public static long getLongNumber(List<Object> objects, QueryWrapper queryWrapper) {
Object object = objects == null || objects.isEmpty() ? null : objects.get(0); Object object = objects == null || objects.isEmpty() ? null : objects.get(0);
if (object == null) { if (object == null) {
return 0; return 0;

View File

@ -28,6 +28,7 @@ import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.util.List;
import java.util.function.Supplier; import java.util.function.Supplier;
import static com.mybatisflex.test.table.AccountTableDef.ACCOUNT; import static com.mybatisflex.test.table.AccountTableDef.ACCOUNT;
@ -58,6 +59,9 @@ public class EntityTestStarter {
AccountMapper accountMapper = bootstrap.getMapper(AccountMapper.class); AccountMapper accountMapper = bootstrap.getMapper(AccountMapper.class);
List<Account> accounts = accountMapper.selectAll();
System.out.println(accounts);
// QueryWrapper wrapper = QueryWrapper.create().select(ACCOUNT.ID // QueryWrapper wrapper = QueryWrapper.create().select(ACCOUNT.ID
// , case_().when(ACCOUNT.ID.ge(2)).then("x2") // , case_().when(ACCOUNT.ID.ge(2)).then("x2")
// .when(ACCOUNT.ID.ge(1)).then("x1") // .when(ACCOUNT.ID.ge(1)).then("x1")

View File

@ -0,0 +1,62 @@
/**
* Copyright (c) 2022-2023, Mybatis-Flex (fuhai999@gmail.com).
* <p>
* 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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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.mybatisflex.test;
import com.mybatisflex.core.MybatisFlexBootstrap;
import com.mybatisflex.core.audit.AuditManager;
import com.mybatisflex.core.audit.ConsoleMessageCollector;
import com.mybatisflex.core.audit.MessageCollector;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.util.MapperUtil;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import javax.sql.DataSource;
import java.util.List;
public class JoinTester {
public static void main(String[] args) {
DataSource dataSource = new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.H2)
.addScript("schema.sql")
.addScript("data.sql")
.build();
MybatisFlexBootstrap bootstrap = MybatisFlexBootstrap.getInstance()
.setDataSource(dataSource)
.addMapper(AccountMapper.class)
.start();
//开启审计功能
AuditManager.setAuditEnable(true);
//设置 SQL 审计收集器
MessageCollector collector = new ConsoleMessageCollector();
AuditManager.setMessageCollector(collector);
AccountMapper accountMapper = bootstrap.getMapper(AccountMapper.class);
List<Account> accounts = accountMapper.selectAll();
System.out.println(accounts);
QueryWrapper queryWrapper = MapperUtil.rawCountQueryWrapper(QueryWrapper.create().from("tb_account"));
System.out.println(">>>>>>> count: " + accountMapper.selectCountByQuery(queryWrapper));
}
}