Merge remote-tracking branch 'gitee/main'

# Conflicts:
#	mybatis-flex-test/mybatis-flex-spring-boot-test/src/test/java/com/mybatisflex/test/common/QueryWrapperTest.java
This commit is contained in:
Michael Yang 2024-10-28 16:46:25 +08:00
commit cd23561a20
3 changed files with 26 additions and 14 deletions

View File

@ -978,15 +978,17 @@ public class QueryColumn implements CloneSupport<QueryColumn>, Conditional<Query
// 可以省略表的引用直接使用列名 // 可以省略表的引用直接使用列名
// SELECT 1 // SELECT 1
// SELECT id FROM tb_user // SELECT id FROM tb_user
if (queryTables == null || queryTables.isEmpty() || queryTables.size() == 1) { if (queryTables == null || queryTables.isEmpty()) {
return null; return null;
} }
QueryTable consideredTable = queryTables.get(0);
// 列未指定表名仅以字符串的形式输入列名 // 列未指定表名仅以字符串的形式输入列名
// 以查询表中的第一个表为主 // 以查询表中的第一个表为主
// SELECT tb_user.id FROM tb_user // SELECT tb_user.id FROM tb_user
if (selfTable == null) { if (selfTable == null) {
return queryTables.get(0); return consideredTable;
} }
// 当前表有别名以别名为主 // 当前表有别名以别名为主
@ -995,7 +997,14 @@ public class QueryColumn implements CloneSupport<QueryColumn>, Conditional<Query
return selfTable; return selfTable;
} }
QueryTable consideredTable = selfTable; // 当前表没有别名查询表只有一个
// 如果两个表是一样的则可以忽略表的引用
// 兼容子查询时子查询的查询表和父查询没有合并的问题
if (queryTables.size() == 1 && Objects.equals(selfTable.name, consideredTable.name)) {
return null;
}
consideredTable = selfTable;
// 当前表存在且没有别名 // 当前表存在且没有别名
ListIterator<QueryTable> it = queryTables.listIterator(queryTables.size()); ListIterator<QueryTable> it = queryTables.listIterator(queryTables.size());

View File

@ -41,7 +41,7 @@ public class SelectQueryColumn extends QueryColumn implements HasParamsColumn {
@Override @Override
protected String toConditionSql(List<QueryTable> queryTables, IDialect dialect) { protected String toConditionSql(List<QueryTable> queryTables, IDialect dialect) {
return dialect.forSelectByQuery(queryWrapper); return WrapperUtil.withBracket(dialect.forSelectByQuery(queryWrapper));
} }
@Override @Override

View File

@ -69,17 +69,20 @@ public class MapperUtil {
.select(count().as("total")) .select(count().as("total"))
.from(queryWrapper).as("t"); .from(queryWrapper).as("t");
} }
public static QueryWrapper rawCountQueryWrapper(QueryWrapper queryWrapper,List<QueryColumn> customCountColumns) {
return customCountColumns!=null?QueryWrapper.create() public static QueryWrapper rawCountQueryWrapper(QueryWrapper queryWrapper, List<QueryColumn> customCountColumns) {
return customCountColumns != null ? QueryWrapper.create()
.select(customCountColumns) .select(customCountColumns)
.from(queryWrapper).as("t"):rawCountQueryWrapper(queryWrapper); .from(queryWrapper).as("t") : rawCountQueryWrapper(queryWrapper);
} }
/** /**
* 优化 COUNT 查询语句 * 优化 COUNT 查询语句
*/ */
public static QueryWrapper optimizeCountQueryWrapper(QueryWrapper queryWrapper) { public static QueryWrapper optimizeCountQueryWrapper(QueryWrapper queryWrapper) {
return optimizeCountQueryWrapper(queryWrapper, Collections.singletonList(count().as("total"))); return optimizeCountQueryWrapper(queryWrapper, Collections.singletonList(count().as("total")));
} }
/** /**
* 优化 COUNT 查询语句 * 优化 COUNT 查询语句
*/ */
@ -88,10 +91,10 @@ public class MapperUtil {
QueryWrapper clone = queryWrapper.clone(); QueryWrapper clone = queryWrapper.clone();
List<UnionWrapper> unions = CPI.getUnions(clone); List<UnionWrapper> unions = CPI.getUnions(clone);
if(!CollectionUtil.isEmpty(unions)){ if (!CollectionUtil.isEmpty(unions)) {
List<UnionWrapper> newUnions = new ArrayList<>(unions.size()); List<UnionWrapper> newUnions = new ArrayList<>(unions.size());
for (UnionWrapper union : unions) { for (UnionWrapper union : unions) {
QueryWrapper unionQuery = optimizeCountQueryWrapper(union.getQueryWrapper().clone(),null); QueryWrapper unionQuery = optimizeCountQueryWrapper(union.getQueryWrapper().clone(), null);
UnionWrapper clone1 = union.clone(); UnionWrapper clone1 = union.clone();
clone1.setQueryWrapper(unionQuery); clone1.setQueryWrapper(unionQuery);
newUnions.add(clone1); newUnions.add(clone1);
@ -108,17 +111,17 @@ public class MapperUtil {
// 如果有 distinctgroup byhaving 等语句则不优化 // 如果有 distinctgroup byhaving 等语句则不优化
// 这种一旦优化了就会造成 count 语句查询出来的值不对 // 这种一旦优化了就会造成 count 语句查询出来的值不对
if (hasDistinct(selectColumns) || hasGroupBy(groupByColumns) || havingCondition != null) { if (hasDistinct(selectColumns) || hasGroupBy(groupByColumns) || havingCondition != null) {
return clone; return rawCountQueryWrapper(clone);
} }
// 判断能不能清除 join 语句 // 判断能不能清除 join 语句
if (canClearJoins(clone)) { if (canClearJoins(clone)) {
CPI.setJoins(clone, null); CPI.setJoins(clone, null);
} }
// select 里面的列换成 COUNT(*) AS `total` // select 里面的列换成 COUNT(*) AS `total`
if(customCountColumns!=null){ if (customCountColumns != null) {
if(hasUnion(clone)){ if (hasUnion(clone)) {
return rawCountQueryWrapper(clone,customCountColumns); return rawCountQueryWrapper(clone, customCountColumns);
}else { } else {
CPI.setSelectColumns(clone, customCountColumns); CPI.setSelectColumns(clone, customCountColumns);
} }
} }