This commit is contained in:
admin 2021-02-22 11:52:12 +08:00
parent 3274f01d5a
commit fd49a1fafc
3 changed files with 9 additions and 94 deletions

View File

@ -98,7 +98,7 @@ public class JoinLambdaWrapper<T> extends JoinAbstractLambdaWrapper<T, JoinLambd
/**
* 不建议直接 new 该实例使用 Wrappers.lambdaQuery(...)
*/
JoinLambdaWrapper(T entity, Class<T> entityClass, SharedString sqlSelect, AtomicInteger paramNameSeq,
JoinLambdaWrapper(T entity, Class<T> entityClass, AtomicInteger paramNameSeq,
Map<String, Object> paramNameValuePairs, MergeSegments mergeSegments,
SharedString lastSql, SharedString sqlComment, SharedString sqlFirst) {
super.setEntity(entity);
@ -112,14 +112,9 @@ public class JoinLambdaWrapper<T> extends JoinAbstractLambdaWrapper<T, JoinLambd
this.sqlFirst = sqlFirst;
}
/**
* 用于生成嵌套 sql
* <p> sqlSelect 不向下传递</p>
*/
@Override
protected JoinLambdaWrapper<T> instance() {
return new JoinLambdaWrapper<>(getEntity(), getEntityClass(), null, paramNameSeq, paramNameValuePairs,
return new JoinLambdaWrapper<>(getEntity(), getEntityClass(), paramNameSeq, paramNameValuePairs,
new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString());
}

View File

@ -1,86 +0,0 @@
package com.github.yulichang.query;
import com.baomidou.mybatisplus.core.conditions.AbstractWrapper;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.core.toolkit.LambdaUtils;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.support.ColumnCache;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.core.toolkit.support.SerializedLambda;
import com.github.yulichang.toolkit.Constant;
import org.apache.ibatis.reflection.property.PropertyNamer;
import java.util.Arrays;
import java.util.Map;
import static java.util.stream.Collectors.joining;
/**
* copy {@link com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper}
*/
@SuppressWarnings("serial")
public abstract class MPJAbstractLambdaWrapper<T, Children extends MPJAbstractLambdaWrapper<T, Children>>
extends AbstractWrapper<T, SFunction<T, ?>, Children> {
private Map<String, ColumnCache> columnMap = null;
private boolean initColumnMap = false;
@SuppressWarnings("unchecked")
@Override
protected String columnsToString(SFunction<T, ?>... columns) {
return columnsToString(true, columns);
}
@SuppressWarnings("unchecked")
protected String columnsToString(boolean onlyColumn, SFunction<T, ?>... columns) {
return Arrays.stream(columns).map(i -> columnToString(i, onlyColumn)).collect(joining(StringPool.COMMA));
}
@Override
protected String columnToString(SFunction<T, ?> column) {
return columnToString(column, true);
}
protected String columnToString(SFunction<T, ?> column, boolean onlyColumn) {
return Constant.TABLE_ALIAS + StringPool.DOT + getColumn(LambdaUtils.resolve(column), onlyColumn);
}
/**
* 获取 SerializedLambda 对应的列信息 lambda 表达式中推测实体类
* <p>
* 如果获取不到列信息那么本次条件组装将会失败
*
* @param lambda lambda 表达式
* @param onlyColumn 如果是结果: "name", 如果否 "name" as "name"
* @return
* @throws com.baomidou.mybatisplus.core.exceptions.MybatisPlusException 获取不到列信息时抛出异常
* @see SerializedLambda#getImplClass()
* @see SerializedLambda#getImplMethodName()
*/
private String getColumn(SerializedLambda lambda, boolean onlyColumn) {
Class<?> aClass = lambda.getInstantiatedType();
tryInitCache(aClass);
String fieldName = PropertyNamer.methodToProperty(lambda.getImplMethodName());
ColumnCache columnCache = getColumnCache(fieldName, aClass);
return onlyColumn ? columnCache.getColumn() : columnCache.getColumnSelect();
}
private void tryInitCache(Class<?> lambdaClass) {
if (!initColumnMap) {
final Class<T> entityClass = getEntityClass();
if (entityClass != null) {
lambdaClass = entityClass;
}
columnMap = LambdaUtils.getColumnMap(lambdaClass);
initColumnMap = true;
}
Assert.notNull(columnMap, "can not find lambda cache for this entity [%s]", lambdaClass.getName());
}
private ColumnCache getColumnCache(String fieldName, Class<?> lambdaClass) {
ColumnCache columnCache = columnMap.get(LambdaUtils.formatKey(fieldName));
Assert.notNull(columnCache, "can not find lambda cache for this property [%s] of entity [%s]",
fieldName, lambdaClass.getName());
return columnCache;
}
}

View File

@ -1,5 +1,6 @@
package com.github.yulichang.query;
import com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper;
import com.baomidou.mybatisplus.core.conditions.SharedString;
import com.baomidou.mybatisplus.core.conditions.query.Query;
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
@ -28,7 +29,7 @@ import java.util.stream.Collectors;
* sqlSelect 由覆盖改为追加
*/
@SuppressWarnings("all")
public class MPJLambdaQueryWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaQueryWrapper<T>>
public class MPJLambdaQueryWrapper<T> extends AbstractLambdaWrapper<T, MPJLambdaQueryWrapper<T>>
implements Query<MPJLambdaQueryWrapper<T>, T, SFunction<T, ?>>, MPJJoin<MPJLambdaQueryWrapper<T>> {
/**
@ -112,6 +113,11 @@ public class MPJLambdaQueryWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLam
return typedThis;
}
@Override
protected String columnToString(SFunction<T, ?> column, boolean onlyColumn) {
return Constant.TABLE_ALIAS + StringPool.DOT + super.columnToString(column, onlyColumn);
}
@SafeVarargs
public final MPJLambdaQueryWrapper<T> select(String... columns) {
return select(true, columns);