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;
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.table.TableInfo;
@ -41,10 +42,10 @@ public abstract class AbstractLogicDeleteProcessor implements LogicDeleteProcess
}
@Override
public void buildQueryCondition(QueryWrapper queryWrapper, TableInfo tableInfo) {
queryWrapper.and(QueryCondition.create(tableInfo.getSchema(), tableInfo.getTableName(), tableInfo.getLogicDeleteColumn()
, EQUALS
, getLogicNormalValue()));
public void buildQueryCondition(QueryWrapper queryWrapper, TableInfo tableInfo, String joinTableAlias) {
QueryTable queryTable = new QueryTable(tableInfo.getSchema(), tableInfo.getTableName()).as(joinTableAlias);
QueryColumn queryColumn = new QueryColumn(queryTable, tableInfo.getLogicDeleteColumn());
queryWrapper.and(queryColumn.eq(getLogicNormalValue()));
}
}

View File

@ -44,11 +44,11 @@ public interface LogicDeleteProcessor {
/**
* 用于构建通过 {@link QueryWrapper} 查询数据时的内容
*
* @param queryWrapper 条件构造器
* @param queryWrapper 条件构造器
* @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.query.QueryColumn;
import com.mybatisflex.core.query.QueryTable;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.table.TableInfo;
@ -35,8 +36,9 @@ public abstract class NullableColumnLogicDeleteProcessor extends AbstractLogicDe
}
@Override
public void buildQueryCondition(QueryWrapper queryWrapper, TableInfo tableInfo) {
QueryColumn queryColumn = new QueryColumn(tableInfo.getSchema(), tableInfo.getTableName(), tableInfo.getLogicDeleteColumn());
public void buildQueryCondition(QueryWrapper queryWrapper, TableInfo tableInfo, String joinTableAlias) {
QueryTable queryTable = new QueryTable(tableInfo.getSchema(), tableInfo.getTableName()).as(joinTableAlias);
QueryColumn queryColumn = new QueryColumn(queryTable, tableInfo.getLogicDeleteColumn());
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.dialect.IDialect;
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 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 {
@ -40,13 +39,6 @@ public class DefaultLogicDeleteProcessor extends AbstractLogicDeleteProcessor {
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
public Object getLogicNormalValue() {
return FlexGlobalConfig.getDefaultConfig().getNormalValueOfLogicDelete();

View File

@ -80,6 +80,14 @@ public class QueryTable implements CloneSupport<QueryTable> {
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) {
this.alias = alias;
return this;

View File

@ -779,7 +779,8 @@ public class TableInfo {
//逻辑删除
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)) {
for (Join join : joins) {
QueryTable joinQueryTable = CPI.getJoinQueryTable(join);
//join select
if (joinQueryTable instanceof SelectQueryTable) {
QueryWrapper childQuery = ((SelectQueryTable) joinQueryTable).getQueryWrapper();
doAppendConditions(entity, childQuery);
} else {
}
//join table
else {
String nameWithSchema = joinQueryTable.getNameWithSchema();
if (StringUtil.isNotBlank(nameWithSchema)) {
TableInfo tableInfo = TableInfoFactory.ofTableName(nameWithSchema);
@ -812,8 +816,10 @@ public class TableInfo {
QueryCondition joinQueryCondition = CPI.getJoinQueryCondition(join);
QueryWrapper newWrapper = QueryWrapper.create()
.where(joinQueryCondition);
CPI.putContext(newWrapper, "joinTableAlias", joinQueryTable.getAlias());
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);
}
/**
* 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
public void testSelectAsToDTO() {