fix: fixed and close #I7QD29

This commit is contained in:
开源海哥 2023-08-03 17:53:15 +08:00
parent 4998646191
commit 712b0e73c8
7 changed files with 46 additions and 23 deletions

View File

@ -16,7 +16,8 @@
package com.mybatisflex.core.logicdelete; package com.mybatisflex.core.logicdelete;
import com.mybatisflex.core.dialect.IDialect; import com.mybatisflex.core.dialect.IDialect;
import com.mybatisflex.core.query.QueryCondition; import com.mybatisflex.core.query.QueryColumn;
import com.mybatisflex.core.query.QueryTable;
import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.table.TableInfo; import com.mybatisflex.core.table.TableInfo;
@ -41,10 +42,10 @@ public abstract class AbstractLogicDeleteProcessor implements LogicDeleteProcess
} }
@Override @Override
public void buildQueryCondition(QueryWrapper queryWrapper, TableInfo tableInfo) { public void buildQueryCondition(QueryWrapper queryWrapper, TableInfo tableInfo, String joinTableAlias) {
queryWrapper.and(QueryCondition.create(tableInfo.getSchema(), tableInfo.getTableName(), tableInfo.getLogicDeleteColumn() QueryTable queryTable = new QueryTable(tableInfo.getSchema(), tableInfo.getTableName()).as(joinTableAlias);
, EQUALS QueryColumn queryColumn = new QueryColumn(queryTable, tableInfo.getLogicDeleteColumn());
, getLogicNormalValue())); queryWrapper.and(queryColumn.eq(getLogicNormalValue()));
} }
} }

View File

@ -44,11 +44,11 @@ public interface LogicDeleteProcessor {
/** /**
* 用于构建通过 {@link QueryWrapper} 查询数据时的内容 * 用于构建通过 {@link QueryWrapper} 查询数据时的内容
* * @param queryWrapper 条件构造器
* @param queryWrapper 条件构造器
* @param tableInfo 表信息 * @param tableInfo 表信息
* @param joinTableAlias join table 的别名
*/ */
void buildQueryCondition(QueryWrapper queryWrapper, TableInfo tableInfo); void buildQueryCondition(QueryWrapper queryWrapper, TableInfo tableInfo, String joinTableAlias);
/** /**
* 获取逻辑删除列未删除标记值 * 获取逻辑删除列未删除标记值

View File

@ -18,6 +18,7 @@ package com.mybatisflex.core.logicdelete;
import com.mybatisflex.core.dialect.IDialect; import com.mybatisflex.core.dialect.IDialect;
import com.mybatisflex.core.query.QueryColumn; import com.mybatisflex.core.query.QueryColumn;
import com.mybatisflex.core.query.QueryTable;
import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.table.TableInfo; import com.mybatisflex.core.table.TableInfo;
@ -35,8 +36,9 @@ public abstract class NullableColumnLogicDeleteProcessor extends AbstractLogicDe
} }
@Override @Override
public void buildQueryCondition(QueryWrapper queryWrapper, TableInfo tableInfo) { public void buildQueryCondition(QueryWrapper queryWrapper, TableInfo tableInfo, String joinTableAlias) {
QueryColumn queryColumn = new QueryColumn(tableInfo.getSchema(), tableInfo.getTableName(), tableInfo.getLogicDeleteColumn()); QueryTable queryTable = new QueryTable(tableInfo.getSchema(), tableInfo.getTableName()).as(joinTableAlias);
QueryColumn queryColumn = new QueryColumn(queryTable, tableInfo.getLogicDeleteColumn());
queryWrapper.and(queryColumn.isNull()); queryWrapper.and(queryColumn.isNull());
} }

View File

@ -18,8 +18,6 @@ package com.mybatisflex.core.logicdelete.impl;
import com.mybatisflex.core.FlexGlobalConfig; import com.mybatisflex.core.FlexGlobalConfig;
import com.mybatisflex.core.dialect.IDialect; import com.mybatisflex.core.dialect.IDialect;
import com.mybatisflex.core.logicdelete.AbstractLogicDeleteProcessor; import com.mybatisflex.core.logicdelete.AbstractLogicDeleteProcessor;
import com.mybatisflex.core.query.QueryCondition;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.table.TableInfo; import com.mybatisflex.core.table.TableInfo;
import static com.mybatisflex.core.constant.SqlConsts.EQUALS; import static com.mybatisflex.core.constant.SqlConsts.EQUALS;
@ -27,6 +25,7 @@ import static com.mybatisflex.core.constant.SqlConsts.SINGLE_QUOTE;
/** /**
* 默认逻辑删除处理器 * 默认逻辑删除处理器
* @author michael
*/ */
public class DefaultLogicDeleteProcessor extends AbstractLogicDeleteProcessor { public class DefaultLogicDeleteProcessor extends AbstractLogicDeleteProcessor {
@ -40,13 +39,6 @@ public class DefaultLogicDeleteProcessor extends AbstractLogicDeleteProcessor {
return dialect.wrap(logicColumn) + EQUALS + prepareValue(getLogicDeletedValue()); return dialect.wrap(logicColumn) + EQUALS + prepareValue(getLogicDeletedValue());
} }
@Override
public void buildQueryCondition(QueryWrapper queryWrapper, TableInfo tableInfo) {
queryWrapper.where(QueryCondition.create(tableInfo.getSchema(), tableInfo.getTableName(), tableInfo.getLogicDeleteColumn()
, EQUALS
, getLogicNormalValue()));
}
@Override @Override
public Object getLogicNormalValue() { public Object getLogicNormalValue() {
return FlexGlobalConfig.getDefaultConfig().getNormalValueOfLogicDelete(); return FlexGlobalConfig.getDefaultConfig().getNormalValueOfLogicDelete();

View File

@ -80,6 +80,14 @@ public class QueryTable implements CloneSupport<QueryTable> {
return StringUtil.isNotBlank(schema) ? schema + "." + name : name; return StringUtil.isNotBlank(schema) ? schema + "." + name : name;
} }
public String getAlias() {
return alias;
}
public void setAlias(String alias) {
this.alias = alias;
}
public QueryTable as(String alias) { public QueryTable as(String alias) {
this.alias = alias; this.alias = alias;
return this; return this;

View File

@ -779,7 +779,8 @@ public class TableInfo {
//逻辑删除 //逻辑删除
if (StringUtil.isNotBlank(getLogicDeleteColumnOrSkip())) { if (StringUtil.isNotBlank(getLogicDeleteColumnOrSkip())) {
LogicDeleteManager.getProcessor().buildQueryCondition(queryWrapper, this); String joinTableAlias = CPI.getContext(queryWrapper, "joinTableAlias");
LogicDeleteManager.getProcessor().buildQueryCondition(queryWrapper, this, joinTableAlias);
} }
//多租户 //多租户
@ -800,11 +801,14 @@ public class TableInfo {
if (CollectionUtil.isNotEmpty(joins)) { if (CollectionUtil.isNotEmpty(joins)) {
for (Join join : joins) { for (Join join : joins) {
QueryTable joinQueryTable = CPI.getJoinQueryTable(join); QueryTable joinQueryTable = CPI.getJoinQueryTable(join);
//join select
if (joinQueryTable instanceof SelectQueryTable) { if (joinQueryTable instanceof SelectQueryTable) {
QueryWrapper childQuery = ((SelectQueryTable) joinQueryTable).getQueryWrapper(); QueryWrapper childQuery = ((SelectQueryTable) joinQueryTable).getQueryWrapper();
doAppendConditions(entity, childQuery); doAppendConditions(entity, childQuery);
} else { }
//join table
else {
String nameWithSchema = joinQueryTable.getNameWithSchema(); String nameWithSchema = joinQueryTable.getNameWithSchema();
if (StringUtil.isNotBlank(nameWithSchema)) { if (StringUtil.isNotBlank(nameWithSchema)) {
TableInfo tableInfo = TableInfoFactory.ofTableName(nameWithSchema); TableInfo tableInfo = TableInfoFactory.ofTableName(nameWithSchema);
@ -812,8 +816,10 @@ public class TableInfo {
QueryCondition joinQueryCondition = CPI.getJoinQueryCondition(join); QueryCondition joinQueryCondition = CPI.getJoinQueryCondition(join);
QueryWrapper newWrapper = QueryWrapper.create() QueryWrapper newWrapper = QueryWrapper.create()
.where(joinQueryCondition); .where(joinQueryCondition);
CPI.putContext(newWrapper, "joinTableAlias", joinQueryTable.getAlias());
tableInfo.appendConditions(entity, newWrapper); tableInfo.appendConditions(entity, newWrapper);
CPI.setJoinQueryCondition(join, CPI.getWhereQueryCondition(newWrapper)); QueryCondition whereQueryCondition = CPI.getWhereQueryCondition(newWrapper);
CPI.setJoinQueryCondition(join, whereQueryCondition);
} }
} }
} }

View File

@ -116,6 +116,20 @@ public class AccountTester {
System.out.println(accounts); System.out.println(accounts);
} }
/**
* issues https://gitee.com/mybatis-flex/mybatis-flex/issues/I7QD29
*/
@Test
public void testLeftJoinSelfForLogicDelete() {
QueryWrapper queryWrapper = QueryWrapper.create();
queryWrapper.from(ACCOUNT)
.leftJoin(ACCOUNT).as("a1").on(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID))
.leftJoin(ACCOUNT).as("a2").on(ACCOUNT.ID.eq(ARTICLE.ACCOUNT_ID))
.where(ACCOUNT.ID.ge(1));
List<Article> accounts = articleMapper.selectListByQuery(queryWrapper);
System.out.println(accounts);
}
@Test @Test
public void testSelectAsToDTO() { public void testSelectAsToDTO() {