字段自定义前缀

This commit is contained in:
yulichang 2023-12-07 02:08:20 +08:00
parent aa0f9e87bf
commit 8170305daf
11 changed files with 810 additions and 365 deletions

View File

@ -30,7 +30,7 @@ public class MPJInterceptorConfig {
System.out.println(" _ _ |_ _ _|_. ___ _ | _ . _ . _ \n" +
"| | |\\/|_)(_| | |_\\ |_)||_|_\\ | (_) | | | \n" +
" / | /\n" +
" 1.4.7.2");
" 1.4.8");
}
}

View File

@ -253,7 +253,7 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
* wrapper.union(UserDO.class, union -> union.selectAll(UserDO.class))
*
* @param clazz union语句的主表类型
* @since 1.4.7.3
* @since 1.4.8
*/
public <U> KtLambdaWrapper<T> union(Class<U> clazz, Consumer<KtLambdaWrapper<U>> consumer) {
KtLambdaWrapper<U> unionWrapper = KtWrappers.query(clazz);
@ -301,7 +301,7 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
* wrapper.unionAll(UserDO.class, union -> union.selectAll(UserDO.class))
*
* @param clazz union语句的主表类型
* @since 1.4.7.3
* @since 1.4.8
*/
public <U> KtLambdaWrapper<T> unionAll(Class<U> clazz, Consumer<KtLambdaWrapper<U>> consumer) {
KtLambdaWrapper<U> unionWrapper = KtWrappers.query(clazz);

View File

@ -6,7 +6,7 @@ import java.util.Locale;
/**
* @author yulichang
* @see HashMap
* @since 1.4.7.3
* @since 1.4.8
*/
public class FieldStringMap<V> extends HashMap<String, V> {

View File

@ -219,19 +219,19 @@ public abstract class MPJAbstractLambdaWrapper<T, Children extends MPJAbstractLa
}
@Override
protected <X> String columnToString(Integer index, X column, boolean isJoin, PrefixEnum prefixEnum) {
return columnToString(index, (SFunction<?, ?>) column, isJoin, prefixEnum);
protected <X> String columnToString(Integer index, String alias, X column, boolean isJoin, PrefixEnum prefixEnum) {
return columnToString(index, alias, (SFunction<?, ?>) column, isJoin, prefixEnum);
}
@Override
@SafeVarargs
protected final <X> String columnsToString(Integer index, boolean isJoin, PrefixEnum prefixEnum, X... columns) {
return Arrays.stream(columns).map(i -> columnToString(index, (SFunction<?, ?>) i, isJoin, prefixEnum)).collect(joining(StringPool.COMMA));
protected final <X> String columnsToString(Integer index, PrefixEnum prefixEnum, String alias, X... columns) {
return Arrays.stream(columns).map(i -> columnToString(index, alias, (SFunction<?, ?>) i, false, prefixEnum)).collect(joining(StringPool.COMMA));
}
protected String columnToString(Integer index, SFunction<?, ?> column, boolean isJoin, PrefixEnum prefixEnum) {
protected String columnToString(Integer index, String alias, SFunction<?, ?> column, boolean isJoin, PrefixEnum prefixEnum) {
Class<?> entityClass = LambdaUtils.getEntityClass(column);
return getDefault(index, entityClass, isJoin, prefixEnum) + StringPool.DOT + getCache(column).getColumn();
return (alias == null ? getDefault(index, entityClass, isJoin, prefixEnum) : alias) + StringPool.DOT + getCache(column).getColumn();
}
protected SelectCache getCache(SFunction<?, ?> fn) {
@ -378,7 +378,7 @@ public abstract class MPJAbstractLambdaWrapper<T, Children extends MPJAbstractLa
TableInfo info = TableHelper.get(clazz);
Asserts.hasTable(info, clazz);
Children instance = instance(newIndex, keyWord, clazz, info.getTableName());
instance.isNo = true;
instance.isOn = true;
instance.isMain = false;
onWrappers.add(instance);
if (StringUtils.isBlank(tableAlias)) {

View File

@ -37,7 +37,7 @@ import static java.util.stream.Collectors.joining;
*
* @author yulichang
*/
@SuppressWarnings("ALL")
@SuppressWarnings({"unchecked", "unused", "DuplicatedCode"})
public abstract class MPJAbstractWrapper<T, Children extends MPJAbstractWrapper<T, Children>> extends Wrapper<T>
implements Compare<Children>, Nested<Children, Children>, Join<Children>, Func<Children>, OnCompare<Children>,
CompareStr<Children, String>, FuncStr<Children, String> {
@ -56,6 +56,7 @@ public abstract class MPJAbstractWrapper<T, Children extends MPJAbstractWrapper<
*/
@Getter
protected AtomicInteger paramNameSeq;
@Getter
protected Map<String, Object> paramNameValuePairs;
/**
* 其他
@ -102,7 +103,7 @@ public abstract class MPJAbstractWrapper<T, Children extends MPJAbstractWrapper<
/**
* 是否是OnWrapper
*/
protected boolean isNo = false;
protected boolean isOn = false;
/**
* 关联的表
@ -201,64 +202,64 @@ public abstract class MPJAbstractWrapper<T, Children extends MPJAbstractWrapper<
}
@Override
public <X> Children eq(boolean condition, SFunction<X, ?> column, Object val) {
return addCondition(condition, column, EQ, val);
public <X> Children eq(boolean condition, String alias, SFunction<X, ?> column, Object val) {
return addCondition(condition, alias, column, EQ, val);
}
@Override
public <X> Children ne(boolean condition, SFunction<X, ?> column, Object val) {
return addCondition(condition, column, NE, val);
public <X> Children ne(boolean condition, String alias, SFunction<X, ?> column, Object val) {
return addCondition(condition, alias, column, NE, val);
}
@Override
public <X> Children gt(boolean condition, SFunction<X, ?> column, Object val) {
return addCondition(condition, column, GT, val);
public <X> Children gt(boolean condition, String alias, SFunction<X, ?> column, Object val) {
return addCondition(condition, alias, column, GT, val);
}
@Override
public <X> Children ge(boolean condition, SFunction<X, ?> column, Object val) {
return addCondition(condition, column, GE, val);
public <X> Children ge(boolean condition, String alias, SFunction<X, ?> column, Object val) {
return addCondition(condition, alias, column, GE, val);
}
@Override
public <X> Children lt(boolean condition, SFunction<X, ?> column, Object val) {
return addCondition(condition, column, LT, val);
public <X> Children lt(boolean condition, String alias, SFunction<X, ?> column, Object val) {
return addCondition(condition, alias, column, LT, val);
}
@Override
public <X> Children le(boolean condition, SFunction<X, ?> column, Object val) {
return addCondition(condition, column, LE, val);
public <X> Children le(boolean condition, String alias, SFunction<X, ?> column, Object val) {
return addCondition(condition, alias, column, LE, val);
}
@Override
public <X> Children like(boolean condition, SFunction<X, ?> column, Object val) {
return likeValue(condition, LIKE, column, val, SqlLike.DEFAULT);
public <X> Children like(boolean condition, String alias, SFunction<X, ?> column, Object val) {
return likeValue(condition, LIKE, alias, column, val, SqlLike.DEFAULT);
}
@Override
public <X> Children notLike(boolean condition, SFunction<X, ?> column, Object val) {
return likeValue(condition, NOT_LIKE, column, val, SqlLike.DEFAULT);
public <X> Children notLike(boolean condition, String alias, SFunction<X, ?> column, Object val) {
return likeValue(condition, NOT_LIKE, alias, column, val, SqlLike.DEFAULT);
}
@Override
public <X> Children likeLeft(boolean condition, SFunction<X, ?> column, Object val) {
return likeValue(condition, LIKE, column, val, SqlLike.LEFT);
public <X> Children likeLeft(boolean condition, String alias, SFunction<X, ?> column, Object val) {
return likeValue(condition, LIKE, alias, column, val, SqlLike.LEFT);
}
@Override
public <X> Children likeRight(boolean condition, SFunction<X, ?> column, Object val) {
return likeValue(condition, LIKE, column, val, SqlLike.RIGHT);
public <X> Children likeRight(boolean condition, String alias, SFunction<X, ?> column, Object val) {
return likeValue(condition, LIKE, alias, column, val, SqlLike.RIGHT);
}
@Override
public <X> Children between(boolean condition, SFunction<X, ?> column, Object val1, Object val2) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), BETWEEN,
public <X> Children between(boolean condition, String alias, SFunction<X, ?> column, Object val1, Object val2) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), BETWEEN,
() -> formatParam(null, val1), AND, () -> formatParam(null, val2)));
}
@Override
public <X> Children notBetween(boolean condition, SFunction<X, ?> column, Object val1, Object val2) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_BETWEEN,
public <X> Children notBetween(boolean condition, String alias, SFunction<X, ?> column, Object val1, Object val2) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), NOT_BETWEEN,
() -> formatParam(null, val1), AND, () -> formatParam(null, val2)));
}
@ -329,89 +330,89 @@ public abstract class MPJAbstractWrapper<T, Children extends MPJAbstractWrapper<
}
@Override
public <X> Children isNull(boolean condition, SFunction<X, ?> column) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IS_NULL));
public <X> Children isNull(boolean condition, String alias, SFunction<X, ?> column) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), IS_NULL));
}
@Override
public <X> Children isNotNull(boolean condition, SFunction<X, ?> column) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IS_NOT_NULL));
public <X> Children isNotNull(boolean condition, String alias, SFunction<X, ?> column) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), IS_NOT_NULL));
}
@Override
public <X> Children in(boolean condition, SFunction<X, ?> column, Collection<?> coll) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IN, inExpression(coll)));
public <X> Children in(boolean condition, String alias, SFunction<X, ?> column, Collection<?> coll) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), IN, inExpression(coll)));
}
@Override
public <X> Children in(boolean condition, SFunction<X, ?> column, Object... values) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IN, inExpression(values)));
public <X> Children in(boolean condition, String alias, SFunction<X, ?> column, Object... values) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), IN, inExpression(values)));
}
@Override
public <X> Children notIn(boolean condition, SFunction<X, ?> column, Collection<?> coll) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_IN, inExpression(coll)));
public <X> Children notIn(boolean condition, String alias, SFunction<X, ?> column, Collection<?> coll) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), NOT_IN, inExpression(coll)));
}
@Override
public <X> Children notIn(boolean condition, SFunction<X, ?> column, Object... values) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_IN, inExpression(values)));
public <X> Children notIn(boolean condition, String alias, SFunction<X, ?> column, Object... values) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), NOT_IN, inExpression(values)));
}
@Override
public <X> Children inSql(boolean condition, SFunction<X, ?> column, String inValue) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), IN,
public <X> Children inSql(boolean condition, String alias, SFunction<X, ?> column, String inValue) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), IN,
() -> String.format("(%s)", inValue)));
}
@Override
public <X> Children notInSql(boolean condition, SFunction<X, ?> column, String inValue) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), NOT_IN,
public <X> Children notInSql(boolean condition, String alias, SFunction<X, ?> column, String inValue) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), NOT_IN,
() -> String.format("(%s)", inValue)));
}
@Override
public <X> Children gtSql(boolean condition, SFunction<X, ?> column, String inValue) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), GT,
public <X> Children gtSql(boolean condition, String alias, SFunction<X, ?> column, String inValue) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), GT,
() -> String.format("(%s)", inValue)));
}
@Override
public <X> Children geSql(boolean condition, SFunction<X, ?> column, String inValue) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), GE,
public <X> Children geSql(boolean condition, String alias, SFunction<X, ?> column, String inValue) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), GE,
() -> String.format("(%s)", inValue)));
}
@Override
public <X> Children ltSql(boolean condition, SFunction<X, ?> column, String inValue) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), LT,
public <X> Children ltSql(boolean condition, String alias, SFunction<X, ?> column, String inValue) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), LT,
() -> String.format("(%s)", inValue)));
}
@Override
public <X> Children leSql(boolean condition, SFunction<X, ?> column, String inValue) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), LE,
public <X> Children leSql(boolean condition, String alias, SFunction<X, ?> column, String inValue) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), LE,
() -> String.format("(%s)", inValue)));
}
@Override
public <R> Children groupBy(boolean condition, List<SFunction<R, ?>> columns) {
public <R> Children groupBy(boolean condition, String alias, List<SFunction<R, ?>> columns) {
return maybeDo(condition, () -> {
if (CollectionUtils.isNotEmpty(columns)) {
String one = (StringPool.COMMA + columnsToString(index, false, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, columns));
final String finalOne = one;
final String finalOne = (StringPool.COMMA + columnsToString(index, isOn ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, alias, columns));
appendSqlSegments(GROUP_BY, () -> finalOne);
}
});
}
@SafeVarargs
@Override
public <X> Children groupBy(boolean condition, SFunction<X, ?> column, SFunction<X, ?>... columns) {
public final <X> Children groupBy(boolean condition, String alias, SFunction<X, ?> column, SFunction<X, ?>... columns) {
return maybeDo(condition, () -> {
String one = columnToString(index, column, false, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST);
String one = columnToString(index, alias, column, false, isOn ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST);
if (ArrayUtils.isNotEmpty(columns)) {
one += (StringPool.COMMA + columnsToString(index, false, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, columns));
one += (StringPool.COMMA + columnsToString(index, isOn ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST, alias, columns));
}
final String finalOne = one;
appendSqlSegments(GROUP_BY, () -> finalOne);
@ -419,35 +420,33 @@ public abstract class MPJAbstractWrapper<T, Children extends MPJAbstractWrapper<
}
@Override
public <R> Children orderByAsc(boolean condition, List<SFunction<R, ?>> columns) {
public <R> Children orderByAsc(boolean condition, String alias, List<SFunction<R, ?>> columns) {
return maybeDo(condition, () -> {
final SqlKeyword mode = ASC;
if (CollectionUtils.isNotEmpty(columns)) {
columns.forEach(c -> appendSqlSegments(ORDER_BY,
columnToSqlSegment(index, columnSqlInjectFilter(c), false), mode));
columnToSqlSegment(index, alias, columnSqlInjectFilter(c)), ASC));
}
});
}
@Override
public <R> Children orderByDesc(boolean condition, List<SFunction<R, ?>> columns) {
public <R> Children orderByDesc(boolean condition, String alias, List<SFunction<R, ?>> columns) {
return maybeDo(condition, () -> {
final SqlKeyword mode = DESC;
if (CollectionUtils.isNotEmpty(columns)) {
columns.forEach(c -> appendSqlSegments(ORDER_BY,
columnToSqlSegment(index, columnSqlInjectFilter(c), false), mode));
columnToSqlSegment(index, alias, columnSqlInjectFilter(c)), DESC));
}
});
}
@Override
public <X> Children orderBy(boolean condition, boolean isAsc, SFunction<X, ?> column, SFunction<X, ?>... columns) {
public <X> Children orderBy(boolean condition, boolean isAsc, String alias, SFunction<X, ?> column, SFunction<X, ?>... columns) {
return maybeDo(condition, () -> {
final SqlKeyword mode = isAsc ? ASC : DESC;
appendSqlSegments(ORDER_BY, columnToSqlSegment(index, column, false), mode);
appendSqlSegments(ORDER_BY, columnToSqlSegment(index, alias, column), mode);
if (ArrayUtils.isNotEmpty(columns)) {
Arrays.stream(columns).forEach(c -> appendSqlSegments(ORDER_BY,
columnToSqlSegment(index, columnSqlInjectFilter(c), false), mode));
columnToSqlSegment(index, alias, columnSqlInjectFilter(c)), mode));
}
});
}
@ -456,7 +455,6 @@ public abstract class MPJAbstractWrapper<T, Children extends MPJAbstractWrapper<
* 字段 SQL 注入过滤处理子类重写实现过滤逻辑
*
* @param column 字段内容
* @return
*/
protected <X> SFunction<X, ?> columnSqlInjectFilter(SFunction<X, ?> column) {
return column;
@ -493,8 +491,8 @@ public abstract class MPJAbstractWrapper<T, Children extends MPJAbstractWrapper<
* 内部自用
* <p>拼接 LIKE 以及 </p>
*/
protected <X> Children likeValue(boolean condition, SqlKeyword keyword, SFunction<X, ?> column, Object val, SqlLike sqlLike) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), keyword,
protected <X> Children likeValue(boolean condition, SqlKeyword keyword, String alias, SFunction<X, ?> column, Object val, SqlLike sqlLike) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), keyword,
() -> formatParam(null, SqlUtils.concatLike(val, sqlLike))));
}
@ -511,18 +509,18 @@ public abstract class MPJAbstractWrapper<T, Children extends MPJAbstractWrapper<
* @param sqlKeyword SQL 关键词
* @param val 条件值
*/
protected <X> Children addCondition(boolean condition, SFunction<X, ?> column, SqlKeyword sqlKeyword, Object val) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), sqlKeyword,
protected <X> Children addCondition(boolean condition, String alias, SFunction<X, ?> column, SqlKeyword sqlKeyword, Object val) {
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), sqlKeyword,
() -> formatParam(null, val)));
}
protected <X, S> Children addCondition(boolean condition, SFunction<X, ?> column, SqlKeyword sqlKeyword, SFunction<S, ?> val) {
protected <X, S> Children addCondition(boolean condition, String alias, SFunction<X, ?> column,
SqlKeyword sqlKeyword, String rightAlias, SFunction<S, ?> val) {
Class<X> c = LambdaUtils.getEntityClass(column);
Class<S> v = LambdaUtils.getEntityClass(val);
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, column, false), sqlKeyword,
isNo ?
columnToSqlSegmentS(index, val, v == c && v == joinClass) :
columnToSqlSegmentS(index, val, v == c)
return maybeDo(condition, () -> appendSqlSegments(columnToSqlSegment(index, alias, column), sqlKeyword,
isOn ? columnToSqlSegmentS(index, rightAlias, val, v == c && v == joinClass) :
columnToSqlSegmentS(index, rightAlias, val, v == c)
));
}
@ -563,6 +561,7 @@ public abstract class MPJAbstractWrapper<T, Children extends MPJAbstractWrapper<
* @param params 参数
* @return sql片段
*/
@SuppressWarnings("SameParameterValue")
protected final String formatSqlMaybeWithParam(String sqlStr, String mapping, Object... params) {
if (StringUtils.isBlank(sqlStr)) {
// todo 何时会这样?
@ -646,7 +645,7 @@ public abstract class MPJAbstractWrapper<T, Children extends MPJAbstractWrapper<
onWrappers.clear();
index = null;
isMain = true;
isNo = false;
isOn = false;
}
/**
@ -684,10 +683,6 @@ public abstract class MPJAbstractWrapper<T, Children extends MPJAbstractWrapper<
return expression;
}
public Map<String, Object> getParamNameValuePairs() {
return paramNameValuePairs;
}
public String getParamAlias() {
return paramAlias.getStringValue() == null ? Constants.WRAPPER : paramAlias.getStringValue();
}
@ -698,6 +693,7 @@ public abstract class MPJAbstractWrapper<T, Children extends MPJAbstractWrapper<
* @param paramAlias 参数别名
* @return Children
*/
@SuppressWarnings("UnusedReturnValue")
public Children setParamAlias(String paramAlias) {
Assert.notEmpty(paramAlias, "paramAlias can not be empty!");
this.paramAlias.setStringValue(paramAlias);
@ -707,28 +703,28 @@ public abstract class MPJAbstractWrapper<T, Children extends MPJAbstractWrapper<
/**
* 获取 columnName
*/
protected final <X> ISqlSegment columnToSqlSegment(Integer index, SFunction<X, ?> column, boolean isJoin) {
return () -> columnToString(index, column, isJoin, isNo ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST);
protected final <X> ISqlSegment columnToSqlSegment(Integer index, String alias, SFunction<X, ?> column) {
return () -> columnToString(index, alias, column, false, isOn ? PrefixEnum.ON_FIRST : PrefixEnum.CD_FIRST);
}
protected final <X> ISqlSegment columnToSqlSegmentS(Integer index, SFunction<X, ?> column, boolean isJoin) {
protected final <X> ISqlSegment columnToSqlSegmentS(Integer index, String alias, SFunction<X, ?> column, boolean isJoin) {
PrefixEnum prefixEnum;
if (isMain) {
prefixEnum = isNo ? PrefixEnum.ON_SECOND /* 理论上不可能有这种情况 */ : PrefixEnum.CD_SECOND;
prefixEnum = isOn ? PrefixEnum.ON_SECOND /* 理论上不可能有这种情况 */ : PrefixEnum.CD_SECOND;
} else {
prefixEnum = isNo ? PrefixEnum.ON_SECOND : PrefixEnum.CD_ON_SECOND;
prefixEnum = isOn ? PrefixEnum.ON_SECOND : PrefixEnum.CD_ON_SECOND;
}
return () -> columnToString(index, column, isJoin, prefixEnum);
return () -> columnToString(index, alias, column, isJoin, prefixEnum);
}
protected final <X> ISqlSegment columnToSqlSegment(String column) {
protected final ISqlSegment columnToSqlSegment(String column) {
return () -> columnsToString(column);
}
/**
* 获取 columnName
*/
protected <X> String columnToString(Integer index, X column, boolean isJoin, PrefixEnum prefixEnum) {
protected <X> String columnToString(Integer index, String alias, X column, boolean isJoin, PrefixEnum prefixEnum) {
return (String) column;
}
@ -753,12 +749,10 @@ public abstract class MPJAbstractWrapper<T, Children extends MPJAbstractWrapper<
*
* @param columns 多字段
*/
protected <X> String columnsToString(Integer index, boolean isJoin, PrefixEnum prefixEnum, X... columns) {
return Arrays.stream(columns).map(i -> this.columnToString(index, i, isJoin, prefixEnum)).collect(joining(StringPool.COMMA));
}
abstract <X> String columnsToString(Integer index, PrefixEnum prefixEnum, String alias, X... columns);
@Override
@SuppressWarnings("all")
@SuppressWarnings("MethodDoesntCallSuperMethod")
public Children clone() {
return SerializationUtils.clone(typedThis);
}
@ -775,33 +769,33 @@ public abstract class MPJAbstractWrapper<T, Children extends MPJAbstractWrapper<
/* ************************* on语句重载 *************************** */
@Override
public <R, S> Children eq(boolean condition, SFunction<R, ?> column, SFunction<S, ?> val) {
return addCondition(condition, column, EQ, val);
public <R, S> Children eq(boolean condition, String alias, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return addCondition(condition, alias, column, EQ, rightAlias, val);
}
@Override
public <R, S> Children ne(boolean condition, SFunction<R, ?> column, SFunction<S, ?> val) {
return addCondition(condition, column, NE, val);
public <R, S> Children ne(boolean condition, String alias, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return addCondition(condition, alias, column, NE, rightAlias, val);
}
@Override
public <R, S> Children gt(boolean condition, SFunction<R, ?> column, SFunction<S, ?> val) {
return addCondition(condition, column, GT, val);
public <R, S> Children gt(boolean condition, String alias, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return addCondition(condition, alias, column, GT, rightAlias, val);
}
@Override
public <R, S> Children ge(boolean condition, SFunction<R, ?> column, SFunction<S, ?> val) {
return addCondition(condition, column, GE, val);
public <R, S> Children ge(boolean condition, String alias, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return addCondition(condition, alias, column, GE, rightAlias, val);
}
@Override
public <R, S> Children lt(boolean condition, SFunction<R, ?> column, SFunction<S, ?> val) {
return addCondition(condition, column, LT, val);
public <R, S> Children lt(boolean condition, String alias, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return addCondition(condition, alias, column, LT, rightAlias, val);
}
@Override
public <R, S> Children le(boolean condition, SFunction<R, ?> column, SFunction<S, ?> val) {
return addCondition(condition, column, LE, val);
public <R, S> Children le(boolean condition, String alias, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return addCondition(condition, alias, column, LE, rightAlias, val);
}
/* ****************************************** **/

View File

@ -252,7 +252,7 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
* wrapper.union(UserDO.class, union -> union.selectAll(UserDO.class))
*
* @param clazz union语句的主表类型
* @since 1.4.7.3
* @since 1.4.8
*/
public <U> MPJLambdaWrapper<T> union(Class<U> clazz, Consumer<MPJLambdaWrapper<U>> consumer) {
MPJLambdaWrapper<U> unionWrapper = JoinWrappers.lambda(clazz);
@ -300,7 +300,7 @@ public class MPJLambdaWrapper<T> extends MPJAbstractLambdaWrapper<T, MPJLambdaWr
* wrapper.unionAll(UserDO.class, union -> union.selectAll(UserDO.class))
*
* @param clazz union语句的主表类型
* @since 1.4.7.3
* @since 1.4.8
*/
public <U> MPJLambdaWrapper<T> unionAll(Class<U> clazz, Consumer<MPJLambdaWrapper<U>> consumer) {
MPJLambdaWrapper<U> unionWrapper = JoinWrappers.lambda(clazz);

View File

@ -14,16 +14,12 @@ import java.util.function.BiPredicate;
@SuppressWarnings("unused")
public interface Compare<Children> extends Serializable {
/**
* ignore
*/
default <R, V> Children allEq(Map<SFunction<R, ?>, V> params) {
return allEq(params, true);
}
/**
* ignore
*/
default <R, V> Children allEq(Map<SFunction<R, ?>, V> params, boolean null2IsNull) {
return allEq(true, params, null2IsNull);
}
@ -38,16 +34,12 @@ public interface Compare<Children> extends Serializable {
*/
<R, V> Children allEq(boolean condition, Map<SFunction<R, ?>, V> params, boolean null2IsNull);
/**
* ignore
*/
default <R, V> Children allEq(BiPredicate<SFunction<R, ?>, V> filter, Map<SFunction<R, ?>, V> params) {
return allEq(filter, params, true);
}
/**
* ignore
*/
default <R, V> Children allEq(BiPredicate<SFunction<R, ?>, V> filter, Map<SFunction<R, ?>, V> params, boolean null2IsNull) {
return allEq(true, filter, params, null2IsNull);
}
@ -63,12 +55,16 @@ public interface Compare<Children> extends Serializable {
*/
<R, V> Children allEq(boolean condition, BiPredicate<SFunction<R, ?>, V> filter, Map<SFunction<R, ?>, V> params, boolean null2IsNull);
/**
* ignore
*/
@SuppressWarnings("UnusedReturnValue")
default <R> Children eq(SFunction<R, ?> column, Object val) {
return eq(true, column, val);
return eq(true, null, column, val);
}
default <R> Children eq(String alias, SFunction<R, ?> column, Object val) {
return eq(true, alias, column, val);
}
default <R> Children eq(boolean condition, SFunction<R, ?> column, Object val) {
return eq(condition, null, column, val);
}
/**
@ -79,30 +75,42 @@ public interface Compare<Children> extends Serializable {
* @param val
* @return children
*/
<R> Children eq(boolean condition, SFunction<R, ?> column, Object val);
<R> Children eq(boolean condition, String alias, SFunction<R, ?> column, Object val);
/**
* ignore
*/
default <R> Children ne(SFunction<R, ?> column, Object val) {
return ne(true, column, val);
return ne(true, null, column, val);
}
default <R> Children ne(String alias, SFunction<R, ?> column, Object val) {
return ne(true, alias, column, val);
}
default <R> Children ne(boolean condition, SFunction<R, ?> column, Object val) {
return ne(condition, null, column, val);
}
/**
* 不等于 &lt;&gt;
*
* @param condition 执行条件
* @param alias 字段别名
* @param column 字段
* @param val
* @return children
*/
<R> Children ne(boolean condition, SFunction<R, ?> column, Object val);
<R> Children ne(boolean condition, String alias, SFunction<R, ?> column, Object val);
/**
* ignore
*/
default <R> Children gt(SFunction<R, ?> column, Object val) {
return gt(true, column, val);
return gt(true, null, column, val);
}
default <R> Children gt(String alias, SFunction<R, ?> column, Object val) {
return gt(true, alias, column, val);
}
default <R> Children gt(boolean condition, SFunction<R, ?> column, Object val) {
return gt(condition, null, column, val);
}
/**
@ -113,13 +121,18 @@ public interface Compare<Children> extends Serializable {
* @param val
* @return children
*/
<R> Children gt(boolean condition, SFunction<R, ?> column, Object val);
<R> Children gt(boolean condition, String alias, SFunction<R, ?> column, Object val);
/**
* ignore
*/
default <R> Children ge(SFunction<R, ?> column, Object val) {
return ge(true, column, val);
return ge(true, null, column, val);
}
default <R> Children ge(String alias, SFunction<R, ?> column, Object val) {
return ge(true, alias, column, val);
}
default <R> Children ge(boolean condition, SFunction<R, ?> column, Object val) {
return ge(condition, null, column, val);
}
/**
@ -130,13 +143,19 @@ public interface Compare<Children> extends Serializable {
* @param val
* @return children
*/
<R> Children ge(boolean condition, SFunction<R, ?> column, Object val);
<R> Children ge(boolean condition, String alias, SFunction<R, ?> column, Object val);
/**
* ignore
*/
default <R> Children lt(SFunction<R, ?> column, Object val) {
return lt(true, column, val);
return lt(true, null, column, val);
}
default <R> Children lt(String alias, SFunction<R, ?> column, Object val) {
return lt(true, alias, column, val);
}
default <R> Children lt(boolean condition, SFunction<R, ?> column, Object val) {
return lt(condition, null, column, val);
}
/**
@ -147,13 +166,19 @@ public interface Compare<Children> extends Serializable {
* @param val
* @return children
*/
<R> Children lt(boolean condition, SFunction<R, ?> column, Object val);
<R> Children lt(boolean condition, String alias, SFunction<R, ?> column, Object val);
/**
* ignore
*/
default <R> Children le(SFunction<R, ?> column, Object val) {
return le(true, column, val);
return le(true, null, column, val);
}
default <R> Children le(String alias, SFunction<R, ?> column, Object val) {
return le(true, alias, column, val);
}
default <R> Children le(boolean condition, SFunction<R, ?> column, Object val) {
return le(condition, null, column, val);
}
/**
@ -164,13 +189,19 @@ public interface Compare<Children> extends Serializable {
* @param val
* @return children
*/
<R> Children le(boolean condition, SFunction<R, ?> column, Object val);
<R> Children le(boolean condition, String alias, SFunction<R, ?> column, Object val);
/**
* ignore
*/
default <R> Children between(SFunction<R, ?> column, Object val1, Object val2) {
return between(true, column, val1, val2);
return between(true, null, column, val1, val2);
}
default <R> Children between(String alias, SFunction<R, ?> column, Object val1, Object val2) {
return between(true, alias, column, val1, val2);
}
default <R> Children between(boolean condition, SFunction<R, ?> column, Object val1, Object val2) {
return between(condition, null, column, val1, val2);
}
/**
@ -182,13 +213,19 @@ public interface Compare<Children> extends Serializable {
* @param val2 值2
* @return children
*/
<R> Children between(boolean condition, SFunction<R, ?> column, Object val1, Object val2);
<R> Children between(boolean condition, String alias, SFunction<R, ?> column, Object val1, Object val2);
/**
* ignore
*/
default <R> Children notBetween(SFunction<R, ?> column, Object val1, Object val2) {
return notBetween(true, column, val1, val2);
return notBetween(true, null, column, val1, val2);
}
default <R> Children notBetween(String alias, SFunction<R, ?> column, Object val1, Object val2) {
return notBetween(true, alias, column, val1, val2);
}
default <R> Children notBetween(boolean condition, SFunction<R, ?> column, Object val1, Object val2) {
return notBetween(condition, null, column, val1, val2);
}
/**
@ -200,13 +237,18 @@ public interface Compare<Children> extends Serializable {
* @param val2 值2
* @return children
*/
<R> Children notBetween(boolean condition, SFunction<R, ?> column, Object val1, Object val2);
<R> Children notBetween(boolean condition, String alias, SFunction<R, ?> column, Object val1, Object val2);
/**
* ignore
*/
default <R> Children like(SFunction<R, ?> column, Object val) {
return like(true, column, val);
return like(true, null, column, val);
}
default <R> Children like(String alias, SFunction<R, ?> column, Object val) {
return like(true, alias, column, val);
}
default <R> Children like(boolean condition, SFunction<R, ?> column, Object val) {
return like(condition, null, column, val);
}
/**
@ -217,13 +259,18 @@ public interface Compare<Children> extends Serializable {
* @param val
* @return children
*/
<R> Children like(boolean condition, SFunction<R, ?> column, Object val);
<R> Children like(boolean condition, String alias, SFunction<R, ?> column, Object val);
/**
* ignore
*/
default <R> Children notLike(SFunction<R, ?> column, Object val) {
return notLike(true, column, val);
return notLike(true, null, column, val);
}
default <R> Children notLike(String alias, SFunction<R, ?> column, Object val) {
return notLike(true, alias, column, val);
}
default <R> Children notLike(boolean condition, SFunction<R, ?> column, Object val) {
return notLike(condition, null, column, val);
}
/**
@ -234,13 +281,18 @@ public interface Compare<Children> extends Serializable {
* @param val
* @return children
*/
<R> Children notLike(boolean condition, SFunction<R, ?> column, Object val);
<R> Children notLike(boolean condition, String alias, SFunction<R, ?> column, Object val);
/**
* ignore
*/
default <R> Children likeLeft(SFunction<R, ?> column, Object val) {
return likeLeft(true, column, val);
return likeLeft(true, null, column, val);
}
default <R> Children likeLeft(String alias, SFunction<R, ?> column, Object val) {
return likeLeft(true, alias, column, val);
}
default <R> Children likeLeft(boolean condition, SFunction<R, ?> column, Object val) {
return likeLeft(condition, null, column, val);
}
/**
@ -251,13 +303,18 @@ public interface Compare<Children> extends Serializable {
* @param val
* @return children
*/
<R> Children likeLeft(boolean condition, SFunction<R, ?> column, Object val);
<R> Children likeLeft(boolean condition, String alias, SFunction<R, ?> column, Object val);
/**
* ignore
*/
default <R> Children likeRight(SFunction<R, ?> column, Object val) {
return likeRight(true, column, val);
return likeRight(true, null, column, val);
}
default <R> Children likeRight(String alias, SFunction<R, ?> column, Object val) {
return likeRight(true, alias, column, val);
}
default <R> Children likeRight(boolean condition, SFunction<R, ?> column, Object val) {
return likeRight(condition, null, column, val);
}
/**
@ -268,5 +325,5 @@ public interface Compare<Children> extends Serializable {
* @param val
* @return children
*/
<R> Children likeRight(boolean condition, SFunction<R, ?> column, Object val);
<R> Children likeRight(boolean condition, String alias, SFunction<R, ?> column, Object val);
}

View File

@ -12,15 +12,20 @@ import java.util.function.Consumer;
* <p>
* copy {@link com.baomidou.mybatisplus.core.conditions.interfaces.Func}
*/
@SuppressWarnings({"unchecked", "unused", "JavadocDeclaration"})
@SuppressWarnings({"unchecked", "unused"})
public interface Func<Children> extends Serializable {
/**
* ignore
*/
@SuppressWarnings("UnusedReturnValue")
default <R> Children isNull(SFunction<R, ?> column) {
return isNull(true, column);
return isNull(true, null, column);
}
default <R> Children isNull(String alias, SFunction<R, ?> column) {
return isNull(true, alias, column);
}
default <R> Children isNull(boolean condition, SFunction<R, ?> column) {
return isNull(condition, null, column);
}
/**
@ -31,13 +36,19 @@ public interface Func<Children> extends Serializable {
* @param column 字段
* @return children
*/
<R> Children isNull(boolean condition, SFunction<R, ?> column);
<R> Children isNull(boolean condition, String alias, SFunction<R, ?> column);
/**
* ignore
*/
default <R> Children isNotNull(SFunction<R, ?> column) {
return isNotNull(true, column);
return isNotNull(true, null, column);
}
default <R> Children isNotNull(String alias, SFunction<R, ?> column) {
return isNotNull(true, alias, column);
}
default <R> Children isNotNull(boolean condition, SFunction<R, ?> column) {
return isNotNull(condition, null, column);
}
/**
@ -48,13 +59,19 @@ public interface Func<Children> extends Serializable {
* @param column 字段
* @return children
*/
<R> Children isNotNull(boolean condition, SFunction<R, ?> column);
<R> Children isNotNull(boolean condition, String alias, SFunction<R, ?> column);
/**
* ignore
*/
default <R> Children in(SFunction<R, ?> column, Collection<?> coll) {
return in(true, column, coll);
return in(true, null, column, coll);
}
default <R> Children in(String alias, SFunction<R, ?> column, Collection<?> coll) {
return in(true, alias, column, coll);
}
default <R> Children in(boolean condition, SFunction<R, ?> column, Collection<?> coll) {
return in(condition, null, column, coll);
}
/**
@ -69,13 +86,19 @@ public interface Func<Children> extends Serializable {
* @param coll 数据集合
* @return children
*/
<R> Children in(boolean condition, SFunction<R, ?> column, Collection<?> coll);
<R> Children in(boolean condition, String alias, SFunction<R, ?> column, Collection<?> coll);
/**
* ignore
*/
default <R> Children in(SFunction<R, ?> column, Object... values) {
return in(true, column, values);
return in(true, null, column, values);
}
default <R> Children in(String alias, SFunction<R, ?> column, Object... values) {
return in(true, alias, column, values);
}
default <R> Children in(boolean condition, SFunction<R, ?> column, Object... values) {
return in(condition, null, column, values);
}
/**
@ -90,13 +113,19 @@ public interface Func<Children> extends Serializable {
* @param values 数据数组
* @return children
*/
<R> Children in(boolean condition, SFunction<R, ?> column, Object... values);
<R> Children in(boolean condition, String alias, SFunction<R, ?> column, Object... values);
/**
* ignore
*/
default <R> Children notIn(SFunction<R, ?> column, Collection<?> coll) {
return notIn(true, column, coll);
return notIn(true, null, column, coll);
}
default <R> Children notIn(String alias, SFunction<R, ?> column, Collection<?> coll) {
return notIn(true, alias, column, coll);
}
default <R> Children notIn(boolean condition, SFunction<R, ?> column, Collection<?> coll) {
return notIn(condition, null, column, coll);
}
/**
@ -108,13 +137,19 @@ public interface Func<Children> extends Serializable {
* @param coll 数据集合
* @return children
*/
<R> Children notIn(boolean condition, SFunction<R, ?> column, Collection<?> coll);
<R> Children notIn(boolean condition, String alias, SFunction<R, ?> column, Collection<?> coll);
/**
* ignore
*/
default <R> Children notIn(SFunction<R, ?> column, Object... value) {
return notIn(true, column, value);
default <R> Children notIn(SFunction<R, ?> column, Object... values) {
return notIn(true, null, column, values);
}
default <R> Children notIn(String alias, SFunction<R, ?> column, Object... values) {
return notIn(true, alias, column, values);
}
default <R> Children notIn(boolean condition, SFunction<R, ?> column, Object... values) {
return notIn(condition, null, column, values);
}
/**
@ -126,13 +161,19 @@ public interface Func<Children> extends Serializable {
* @param values 数据数组
* @return children
*/
<R> Children notIn(boolean condition, SFunction<R, ?> column, Object... values);
<R> Children notIn(boolean condition, String alias, SFunction<R, ?> column, Object... values);
/**
* ignore
*/
default <R> Children inSql(SFunction<R, ?> column, String inValue) {
return inSql(true, column, inValue);
return inSql(true, null, column, inValue);
}
default <R> Children inSql(String alias, SFunction<R, ?> column, String inValue) {
return inSql(true, alias, column, inValue);
}
default <R> Children inSql(boolean condition, SFunction<R, ?> column, String inValue) {
return inSql(condition, null, column, inValue);
}
/**
@ -146,13 +187,19 @@ public interface Func<Children> extends Serializable {
* @param inValue sql语句
* @return children
*/
<R> Children inSql(boolean condition, SFunction<R, ?> column, String inValue);
<R> Children inSql(boolean condition, String alias, SFunction<R, ?> column, String inValue);
/**
* ignore
*/
default <R> Children notInSql(SFunction<R, ?> column, String inValue) {
return notInSql(true, column, inValue);
return notInSql(true, null, column, inValue);
}
default <R> Children notInSql(String alias, SFunction<R, ?> column, String inValue) {
return notInSql(true, alias, column, inValue);
}
default <R> Children notInSql(boolean condition, SFunction<R, ?> column, String inValue) {
return notInSql(condition, null, column, inValue);
}
/**
@ -166,26 +213,42 @@ public interface Func<Children> extends Serializable {
* @param inValue sql语句 ---&gt; 1,2,3,4,5,6 或者 select id from table where id &lt; 3
* @return children
*/
<R> Children notInSql(boolean condition, SFunction<R, ?> column, String inValue);
<R> Children notInSql(boolean condition, String alias, SFunction<R, ?> column, String inValue);
default <R> Children gtSql(SFunction<R, ?> column, String inValue) {
return gtSql(true, null, column, inValue);
}
default <R> Children gtSql(String alias, SFunction<R, ?> column, String inValue) {
return gtSql(true, alias, column, inValue);
}
default <R> Children gtSql(boolean condition, SFunction<R, ?> column, String inValue) {
return gtSql(condition, null, column, inValue);
}
/**
* 字段 &gt; ( sql语句 )
* <p>例1: gtSql("id", "1, 2, 3, 4, 5, 6")</p>
* <p>例1: gtSql("id", "select id from table where name = 'JunJun'")</p>
*
* @param condition
* @param column
* @param inValue
* @return
* @param condition 执行条件
* @param column 字段
* @param inValue sql语句 ---&gt; 1,2,3,4,5,6 或者 select id from table where id &lt; 3
* @return children
*/
<R> Children gtSql(boolean condition, SFunction<R, ?> column, String inValue);
<R> Children gtSql(boolean condition, String alias, SFunction<R, ?> column, String inValue);
/**
* ignore
*/
default <R> Children gtSql(SFunction<R, ?> column, String inValue) {
return gtSql(true, column, inValue);
default <R> Children geSql(SFunction<R, ?> column, String inValue) {
return geSql(true, null, column, inValue);
}
default <R> Children geSql(String alias, SFunction<R, ?> column, String inValue) {
return geSql(true, alias, column, inValue);
}
default <R> Children geSql(boolean condition, SFunction<R, ?> column, String inValue) {
return geSql(condition, null, column, inValue);
}
/**
@ -193,18 +256,23 @@ public interface Func<Children> extends Serializable {
* <p>例1: geSql("id", "1, 2, 3, 4, 5, 6")</p>
* <p>例1: geSql("id", "select id from table where name = 'JunJun'")</p>
*
* @param condition
* @param column
* @param inValue
* @return
* @param condition 执行条件
* @param column 字段
* @param inValue sql语句 ---&gt; 1,2,3,4,5,6 或者 select id from table where id &lt; 3
* @return children
*/
<R> Children geSql(boolean condition, SFunction<R, ?> column, String inValue);
<R> Children geSql(boolean condition, String alias, SFunction<R, ?> column, String inValue);
/**
* ignore
*/
default <R> Children geSql(SFunction<R, ?> column, String inValue) {
return geSql(true, column, inValue);
default <R> Children ltSql(SFunction<R, ?> column, String inValue) {
return ltSql(true, null, column, inValue);
}
default <R> Children ltSql(String alias, SFunction<R, ?> column, String inValue) {
return ltSql(true, alias, column, inValue);
}
default <R> Children ltSql(boolean condition, SFunction<R, ?> column, String inValue) {
return ltSql(condition, null, column, inValue);
}
/**
@ -212,18 +280,23 @@ public interface Func<Children> extends Serializable {
* <p>例1: ltSql("id", "1, 2, 3, 4, 5, 6")</p>
* <p>例1: ltSql("id", "select id from table where name = 'JunJun'")</p>
*
* @param condition
* @param column
* @param inValue
* @return
* @param condition 执行条件
* @param column 字段
* @param inValue sql语句 ---&gt; 1,2,3,4,5,6 或者 select id from table where id &lt; 3
* @return children
*/
<R> Children ltSql(boolean condition, SFunction<R, ?> column, String inValue);
<R> Children ltSql(boolean condition, String alias, SFunction<R, ?> column, String inValue);
/**
* ignore
*/
default <R> Children ltSql(SFunction<R, ?> column, String inValue) {
return ltSql(true, column, inValue);
default <R> Children leSql(SFunction<R, ?> column, String inValue) {
return leSql(true, null, column, inValue);
}
default <R> Children leSql(String alias, SFunction<R, ?> column, String inValue) {
return leSql(true, alias, column, inValue);
}
default <R> Children leSql(boolean condition, SFunction<R, ?> column, String inValue) {
return leSql(condition, null, column, inValue);
}
/**
@ -231,44 +304,47 @@ public interface Func<Children> extends Serializable {
* <p>例1: leSql("id", "1, 2, 3, 4, 5, 6")</p>
* <p>例1: leSql("id", "select id from table where name = 'JunJun'")</p>
*
* @param condition
* @param column
* @param inValue
* @return
* @param condition 执行条件
* @param column 字段
* @param inValue sql语句 ---&gt; 1,2,3,4,5,6 或者 select id from table where id &lt; 3
* @return children
*/
<R> Children leSql(boolean condition, SFunction<R, ?> column, String inValue);
<R> Children leSql(boolean condition, String alias, SFunction<R, ?> column, String inValue);
/**
* ignore
*/
default <R> Children leSql(SFunction<R, ?> column, String inValue) {
return leSql(true, column, inValue);
}
/**
* ignore
*/
default <R> Children groupBy(SFunction<R, ?> column) {
return groupBy(true, column);
return groupBy(true, (String) null, column);
}
default <R> Children groupBy(String alias, SFunction<R, ?> column) {
return groupBy(true, alias, column);
}
/**
* ignore
*/
default <R> Children groupBy(List<SFunction<R, ?>> column) {
return groupBy(true, column);
return groupBy(true, null, column);
}
/**
* ignore
*/
<R> Children groupBy(boolean condition, List<SFunction<R, ?>> columns);
default <R> Children groupBy(String alias, List<SFunction<R, ?>> column) {
return groupBy(true, alias, column);
}
default <R> Children groupBy(boolean condition, List<SFunction<R, ?>> columns) {
return groupBy(condition, null, columns);
}
<R> Children groupBy(boolean condition, String alias, List<SFunction<R, ?>> columns);
/**
* ignore
*/
default <R> Children groupBy(SFunction<R, ?> column, SFunction<R, ?>... columns) {
return groupBy(true, column, columns);
return groupBy(true, null, column, columns);
}
default <R> Children groupBy(String alias, SFunction<R, ?> column, SFunction<R, ?>... columns) {
return groupBy(true, alias, column, columns);
}
default <R> Children groupBy(boolean condition, SFunction<R, ?> column, SFunction<R, ?>... columns) {
return groupBy(condition, null, column, columns);
}
/**
@ -280,32 +356,42 @@ public interface Func<Children> extends Serializable {
* @param columns 字段数组
* @return children
*/
<R> Children groupBy(boolean condition, SFunction<R, ?> column, SFunction<R, ?>... columns);
<R> Children groupBy(boolean condition, String alias, SFunction<R, ?> column, SFunction<R, ?>... columns);
/**
* ignore
*/
default <R> Children orderByAsc(SFunction<R, ?> column) {
return orderByAsc(true, column);
return orderByAsc(true, (String) null, column);
}
default <R> Children orderByAsc(String alias, SFunction<R, ?> column) {
return orderByAsc(true, alias, column);
}
/**
* ignore
*/
default <R> Children orderByAsc(List<SFunction<R, ?>> columns) {
return orderByAsc(true, columns);
return orderByAsc(true, null, columns);
}
/**
* ignore
*/
<R> Children orderByAsc(boolean condition, List<SFunction<R, ?>> columns);
default <R> Children orderByAsc(String alias, List<SFunction<R, ?>> columns) {
return orderByAsc(true, alias, columns);
}
default <R> Children orderByAsc(boolean condition, List<SFunction<R, ?>> columns) {
return orderByAsc(condition, null, columns);
}
<R> Children orderByAsc(boolean condition, String alias, List<SFunction<R, ?>> columns);
/**
* ignore
*/
default <R> Children orderByAsc(SFunction<R, ?> column, SFunction<R, ?>... columns) {
return orderByAsc(true, column, columns);
return orderByAsc(true, null, column, columns);
}
default <R> Children orderByAsc(String alias, SFunction<R, ?> column, SFunction<R, ?>... columns) {
return orderByAsc(true, alias, column, columns);
}
default <R> Children orderByAsc(boolean condition, String alias, SFunction<R, ?> column, SFunction<R, ?>... columns) {
return orderBy(condition, true, alias, column, columns);
}
/**
@ -318,33 +404,44 @@ public interface Func<Children> extends Serializable {
* @return children
*/
default <R> Children orderByAsc(boolean condition, SFunction<R, ?> column, SFunction<R, ?>... columns) {
return orderBy(condition, true, column, columns);
return orderBy(condition, true, null, column, columns);
}
/**
* ignore
*/
default <R> Children orderByDesc(SFunction<R, ?> column) {
return orderByDesc(true, column);
return orderByDesc(true, (String) null, column);
}
/**
* ignore
*/
default <R> Children orderByDesc(String alias, SFunction<R, ?> column) {
return orderByDesc(true, alias, column);
}
default <R> Children orderByDesc(List<SFunction<R, ?>> columns) {
return orderByDesc(true, columns);
return orderByDesc(true, null, columns);
}
/**
* ignore
*/
<R> Children orderByDesc(boolean condition, List<SFunction<R, ?>> columns);
default <R> Children orderByDesc(String alias, List<SFunction<R, ?>> columns) {
return orderByDesc(true, alias, columns);
}
default <R> Children orderByDesc(boolean condition, List<SFunction<R, ?>> columns) {
return orderByDesc(condition, null, columns);
}
<R> Children orderByDesc(boolean condition, String alias, List<SFunction<R, ?>> columns);
/**
* ignore
*/
default <R> Children orderByDesc(SFunction<R, ?> column, SFunction<R, ?>... columns) {
return orderByDesc(true, column, columns);
return orderByDesc(true, null, column, columns);
}
default <R> Children orderByDesc(String alias, SFunction<R, ?> column, SFunction<R, ?>... columns) {
return orderByDesc(true, alias, column, columns);
}
default <R> Children orderByDesc(boolean condition, String alias, SFunction<R, ?> column, SFunction<R, ?>... columns) {
return orderBy(condition, false, alias, column, columns);
}
/**
@ -357,7 +454,11 @@ public interface Func<Children> extends Serializable {
* @return children
*/
default <R> Children orderByDesc(boolean condition, SFunction<R, ?> column, SFunction<R, ?>... columns) {
return orderBy(condition, false, column, columns);
return orderBy(condition, false, null, column, columns);
}
default <R> Children orderBy(boolean condition, boolean isAsc, SFunction<R, ?> column, SFunction<R, ?>... columns) {
return orderBy(condition, isAsc, null, column, columns);
}
/**
@ -370,11 +471,9 @@ public interface Func<Children> extends Serializable {
* @param columns 字段数组
* @return children
*/
<R> Children orderBy(boolean condition, boolean isAsc, SFunction<R, ?> column, SFunction<R, ?>... columns);
<R> Children orderBy(boolean condition, boolean isAsc, String alias, SFunction<R, ?> column, SFunction<R, ?>... columns);
/**
* ignore
*/
default Children having(String sqlHaving, Object... params) {
return having(true, sqlHaving, params);
}
@ -391,9 +490,7 @@ public interface Func<Children> extends Serializable {
*/
Children having(boolean condition, String sqlHaving, Object... params);
/**
* ignore
*/
default Children func(Consumer<Children> consumer) {
return func(true, consumer);
}

View File

@ -14,13 +14,36 @@ import java.io.Serializable;
*/
@SuppressWarnings("unused")
public interface OnCompare<Children> extends Serializable {
/**
* ignore
*/
default <R, S> Children eq(SFunction<R, ?> column, SFunction<S, ?> val) {
return eq(true, column, val);
}
default <R, S> Children eq(String alias, SFunction<R, ?> column, SFunction<S, ?> val) {
return eq(true, alias, column, val);
}
default <R, S> Children eq(SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return eq(true, column, rightAlias, val);
}
default <R, S> Children eq(String alias, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return eq(true, alias, column, rightAlias, val);
}
default <R, S> Children eq(boolean condition, SFunction<R, ?> column, SFunction<S, ?> val) {
return eq(condition, null, column, null, val);
}
default <R, S> Children eq(boolean condition, String alias, SFunction<R, ?> column, SFunction<S, ?> val) {
return eq(condition, alias, column, null, val);
}
default <R, S> Children eq(boolean condition, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return eq(condition, null, column, rightAlias, val);
}
/**
* 等于 =
*
@ -29,13 +52,34 @@ public interface OnCompare<Children> extends Serializable {
* @param val
* @return children
*/
<R, S> Children eq(boolean condition, SFunction<R, ?> column, SFunction<S, ?> val);
<R, S> Children eq(boolean condition, String alias, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val);
/**
* ignore
*/
default <R, S> Children ne(SFunction<R, ?> column, SFunction<S, ?> val) {
return ne(true, column, val);
return ne(true, null, column, null, val);
}
default <R, S> Children ne(String alias, SFunction<R, ?> column, SFunction<S, ?> val) {
return ne(true, alias, column, null, val);
}
default <R, S> Children ne(SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return ne(true, null, column, rightAlias, val);
}
default <R, S> Children ne(String alias, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return ne(true, alias, column, rightAlias, val);
}
default <R, S> Children ne(boolean condition, SFunction<R, ?> column, SFunction<S, ?> val) {
return ne(condition, null, column, null, val);
}
default <R, S> Children ne(boolean condition, String alias, SFunction<R, ?> column, SFunction<S, ?> val) {
return ne(condition, alias, column, null, val);
}
default <R, S> Children ne(boolean condition, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return ne(condition, null, column, rightAlias, val);
}
/**
@ -46,13 +90,34 @@ public interface OnCompare<Children> extends Serializable {
* @param val
* @return children
*/
<R, S> Children ne(boolean condition, SFunction<R, ?> column, SFunction<S, ?> val);
<R, S> Children ne(boolean condition, String alias, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val);
/**
* ignore
*/
default <R, S> Children gt(SFunction<R, ?> column, SFunction<S, ?> val) {
return gt(true, column, val);
return gt(true, null, column, null, val);
}
default <R, S> Children gt(String alias, SFunction<R, ?> column, SFunction<S, ?> val) {
return gt(true, alias, column, null, val);
}
default <R, S> Children gt(SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return gt(true, null, column, rightAlias, val);
}
default <R, S> Children gt(String alias, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return gt(true, alias, column, rightAlias, val);
}
default <R, S> Children gt(boolean condition, SFunction<R, ?> column, SFunction<S, ?> val) {
return gt(condition, null, column, null, val);
}
default <R, S> Children gt(boolean condition, String alias, SFunction<R, ?> column, SFunction<S, ?> val) {
return gt(condition, alias, column, null, val);
}
default <R, S> Children gt(boolean condition, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return gt(condition, null, column, rightAlias, val);
}
/**
@ -63,13 +128,34 @@ public interface OnCompare<Children> extends Serializable {
* @param val
* @return children
*/
<R, S> Children gt(boolean condition, SFunction<R, ?> column, SFunction<S, ?> val);
<R, S> Children gt(boolean condition, String alias, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val);
/**
* ignore
*/
default <R, S> Children ge(SFunction<R, ?> column, SFunction<S, ?> val) {
return ge(true, column, val);
return ge(true, null, column, null, val);
}
default <R, S> Children ge(String alias, SFunction<R, ?> column, SFunction<S, ?> val) {
return ge(true, alias, column, null, val);
}
default <R, S> Children ge(SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return ge(true, null, column, rightAlias, val);
}
default <R, S> Children ge(String alias, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return ge(true, alias, column, rightAlias, val);
}
default <R, S> Children ge(boolean condition, SFunction<R, ?> column, SFunction<S, ?> val) {
return ge(condition, null, column, null, val);
}
default <R, S> Children ge(boolean condition, String alias, SFunction<R, ?> column, SFunction<S, ?> val) {
return ge(condition, alias, column, null, val);
}
default <R, S> Children ge(boolean condition, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return ge(condition, null, column, rightAlias, val);
}
/**
@ -80,13 +166,34 @@ public interface OnCompare<Children> extends Serializable {
* @param val
* @return children
*/
<R, S> Children ge(boolean condition, SFunction<R, ?> column, SFunction<S, ?> val);
<R, S> Children ge(boolean condition, String alias, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val);
/**
* ignore
*/
default <R, S> Children lt(SFunction<R, ?> column, SFunction<S, ?> val) {
return lt(true, column, val);
return lt(true, null, column, null, val);
}
default <R, S> Children lt(String alias, SFunction<R, ?> column, SFunction<S, ?> val) {
return lt(true, alias, column, null, val);
}
default <R, S> Children lt(SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return lt(true, null, column, rightAlias, val);
}
default <R, S> Children lt(String alias, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return lt(true, alias, column, rightAlias, val);
}
default <R, S> Children lt(boolean condition, SFunction<R, ?> column, SFunction<S, ?> val) {
return lt(condition, null, column, null, val);
}
default <R, S> Children lt(boolean condition, String alias, SFunction<R, ?> column, SFunction<S, ?> val) {
return lt(condition, alias, column, null, val);
}
default <R, S> Children lt(boolean condition, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return lt(condition, null, column, rightAlias, val);
}
/**
@ -97,13 +204,34 @@ public interface OnCompare<Children> extends Serializable {
* @param val
* @return children
*/
<R, S> Children lt(boolean condition, SFunction<R, ?> column, SFunction<S, ?> val);
<R, S> Children lt(boolean condition, String alias, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val);
/**
* ignore
*/
default <R, S> Children le(SFunction<R, ?> column, SFunction<S, ?> val) {
return le(true, column, val);
return le(true, null, column, null, val);
}
default <R, S> Children le(String alias, SFunction<R, ?> column, SFunction<S, ?> val) {
return le(true, alias, column, null, val);
}
default <R, S> Children le(SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return le(true, null, column, rightAlias, val);
}
default <R, S> Children le(String alias, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return le(true, alias, column, rightAlias, val);
}
default <R, S> Children le(boolean condition, SFunction<R, ?> column, SFunction<S, ?> val) {
return le(condition, null, column, null, val);
}
default <R, S> Children le(boolean condition, String alias, SFunction<R, ?> column, SFunction<S, ?> val) {
return le(condition, alias, column, null, val);
}
default <R, S> Children le(boolean condition, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val) {
return le(condition, null, column, rightAlias, val);
}
/**
@ -114,5 +242,5 @@ public interface OnCompare<Children> extends Serializable {
* @param val
* @return children
*/
<R, S> Children le(boolean condition, SFunction<R, ?> column, SFunction<S, ?> val);
<R, S> Children le(boolean condition, String alias, SFunction<R, ?> column, String rightAlias, SFunction<S, ?> val);
}

View File

@ -25,6 +25,18 @@ public interface QueryJoin<Children, Entity> extends MPJBaseJoin<Entity>, String
return join(Constant.LEFT_JOIN, clazz, left, right);
}
/**
* left join
*
* @param clazz 关联的实体类
* @param left 条件
* @param rightAlias 条件字段别名
* @param right 条件
*/
default <T, X> Children leftJoin(Class<T> clazz, SFunction<T, ?> left, String rightAlias, SFunction<X, ?> right) {
return join(Constant.LEFT_JOIN, clazz, left, rightAlias, right);
}
/**
* left join 多条件
* <p>
@ -71,6 +83,18 @@ public interface QueryJoin<Children, Entity> extends MPJBaseJoin<Entity>, String
return join(Constant.LEFT_JOIN, clazz, alias, left, right);
}
/**
* left join
*
* @param clazz 关联的实体类
* @param rightAlias 条件字段别名
* @param left 条件
* @param right 条件
*/
default <T, X> Children leftJoin(Class<T> clazz, String alias, SFunction<T, ?> left, String rightAlias, SFunction<X, ?> right) {
return join(Constant.LEFT_JOIN, clazz, alias, left, rightAlias, right);
}
/**
* left join 多条件
* <p>
@ -111,6 +135,14 @@ public interface QueryJoin<Children, Entity> extends MPJBaseJoin<Entity>, String
*/
default <T, X> Children rightJoin(Class<T> clazz, SFunction<T, ?> left, SFunction<X, ?> right) {
return join(Constant.RIGHT_JOIN, clazz, left, right);
}
/**
* ignore 参考 left join
*/
default <T, X> Children rightJoin(Class<T> clazz, SFunction<T, ?> left, String rightAlias, SFunction<X, ?> right) {
return join(Constant.RIGHT_JOIN, clazz, left, rightAlias, right);
}
/**
@ -137,8 +169,8 @@ public interface QueryJoin<Children, Entity> extends MPJBaseJoin<Entity>, String
/**
* ignore 参考 left join
*/
default <T, X> Children rightJoin(Class<T> clazz, String alias, SFunction<T, ?> left, SFunction<X, ?> right) {
return join(Constant.RIGHT_JOIN, clazz, alias, left, right);
default <T, X> Children rightJoin(Class<T> clazz, String alias, SFunction<T, ?> left, String rightAlias, SFunction<X, ?> right) {
return join(Constant.RIGHT_JOIN, clazz, alias, left, rightAlias, right);
}
/**
@ -167,7 +199,14 @@ public interface QueryJoin<Children, Entity> extends MPJBaseJoin<Entity>, String
* ignore 参考 left join
*/
default <T, X> Children innerJoin(Class<T> clazz, SFunction<T, ?> left, SFunction<X, ?> right) {
return join(Constant.INNER_JOIN, clazz, on -> on.eq(left, right));
return join(Constant.INNER_JOIN, clazz, left, right);
}
/**
* ignore 参考 left join
*/
default <T, X> Children innerJoin(Class<T> clazz, SFunction<T, ?> left, String rightAlias, SFunction<X, ?> right) {
return join(Constant.INNER_JOIN, clazz, left, rightAlias, right);
}
/**
@ -227,6 +266,13 @@ public interface QueryJoin<Children, Entity> extends MPJBaseJoin<Entity>, String
return join(Constant.FULL_JOIN, clazz, left, right);
}
/**
* ignore 参考 left join
*/
default <T, X> Children fullJoin(Class<T> clazz, SFunction<T, ?> left, String rightAlias, SFunction<X, ?> right) {
return join(Constant.FULL_JOIN, clazz, left, rightAlias, right);
}
/**
* ignore 参考 left join
*/
@ -255,6 +301,13 @@ public interface QueryJoin<Children, Entity> extends MPJBaseJoin<Entity>, String
return join(Constant.FULL_JOIN, clazz, alias, left, right);
}
/**
* ignore 参考 left join
*/
default <T, X> Children fullJoin(Class<T> clazz, String alias, SFunction<T, ?> left, String rightAlias, SFunction<X, ?> right) {
return join(Constant.FULL_JOIN, clazz, alias, left, rightAlias, right);
}
/**
* ignore 参考 left join
*/
@ -291,6 +344,20 @@ public interface QueryJoin<Children, Entity> extends MPJBaseJoin<Entity>, String
return join(keyWord, clazz, on -> on.eq(left, right));
}
/**
* 自定义连表关键词
* <p>
* 查询基类 可以直接调用此方法实现以上所有功能
*
* @param keyWord 连表关键字
* @param clazz 连表实体类
* @param left 关联条件
* @param right 扩展 用于关联表的 select where
*/
default <T, X> Children join(String keyWord, Class<T> clazz, SFunction<T, ?> left, String rightAlias, SFunction<X, ?> right) {
return join(keyWord, clazz, on -> on.eq(left, rightAlias,right));
}
/**
* 自定义连表关键词
* <p>
@ -332,6 +399,21 @@ public interface QueryJoin<Children, Entity> extends MPJBaseJoin<Entity>, String
return join(keyWord, clazz, alias, on -> on.eq(left, right));
}
/**
* 自定义连表关键词
* 调用此方法 keyword 前后需要带空格 比如 " LEFT JOIN " " RIGHT JOIN "
* <p>
* 查询基类 可以直接调用此方法实现以上所有功能
*
* @param keyWord 连表关键字
* @param clazz 连表实体类
* @param left 关联条件
* @param right 扩展 用于关联表的 select where
*/
default <T, X> Children join(String keyWord, Class<T> clazz, String alias, SFunction<T, ?> left, String rightAlias, SFunction<X, ?> right) {
return join(keyWord, clazz, alias, on -> on.eq(left, rightAlias, right));
}
/**
* 自定义连表关键词
* <p>

View File

@ -0,0 +1,87 @@
package com.github.yulichang.test.join.m;
import com.github.yulichang.test.join.entity.AddressDO;
import com.github.yulichang.test.join.entity.AreaDO;
import com.github.yulichang.test.join.entity.UserDO;
import com.github.yulichang.test.join.mapper.UserMapper;
import com.github.yulichang.test.util.Reset;
import com.github.yulichang.test.util.ThreadLocalUtils;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class TableAliasTest {
@Autowired
private UserMapper userMapper;
@BeforeEach
void setUp() {
Reset.reset();
}
@Test
void tableAlias() {
ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by FROM `user` t " +
"LEFT JOIN address addr1 ON (addr1.id = t.address_id) " +
"LEFT JOIN address addr2 ON (addr2.id = t.address_id2) " +
"LEFT JOIN area area1 ON (area1.id = addr1.area_id) " +
"WHERE t.del = false AND addr1.del = false AND addr2.del = false AND area1.del = false " +
"GROUP BY t.id");
MPJLambdaWrapper<UserDO> wrapper = JoinWrappers.lambda(UserDO.class)
.selectAll(UserDO.class)
.leftJoin(AddressDO.class, "addr1", AddressDO::getId, UserDO::getAddressId)
.leftJoin(AddressDO.class, "addr2", AddressDO::getId, UserDO::getAddressId2)
.leftJoin(AreaDO.class, "area1", AreaDO::getId, "addr1", AddressDO::getAreaId)
.groupBy(UserDO::getId);
List<UserDO> dos = userMapper.selectJoinList(UserDO.class, wrapper);
dos.forEach(System.out::println);
}
@Test
void tableAlias2() {
ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by FROM `user` t " +
"LEFT JOIN address addr1 ON (addr1.id = t.address_id) " +
"LEFT JOIN address addr2 ON (addr2.id = t.address_id2) " +
"LEFT JOIN area area1 ON (area1.id = addr2.area_id) " +
"WHERE t.del = false AND addr1.del = false AND addr2.del = false AND area1.del = false " +
"GROUP BY t.id ORDER BY addr1.id DESC");
MPJLambdaWrapper<UserDO> wrapper = JoinWrappers.lambda(UserDO.class)
.selectAll(UserDO.class)
.leftJoin(AddressDO.class, "addr1", AddressDO::getId, UserDO::getAddressId)
.leftJoin(AddressDO.class, "addr2", AddressDO::getId, UserDO::getAddressId2)
.leftJoin(AreaDO.class, "area1", AreaDO::getId, "addr2", AddressDO::getAreaId)
.groupBy(UserDO::getId)
.orderByDesc("addr1", AddressDO::getId);
List<UserDO> dos = userMapper.selectJoinList(UserDO.class, wrapper);
dos.forEach(System.out::println);
}
@Test
void tableAliasEQ() {
ThreadLocalUtils.set("SELECT t.id, t.pid, t.`name`, t.`json`, t.sex, t.head_img, t.create_time, t.address_id, t.address_id2, t.del, t.create_by, t.update_by FROM `user` t " +
"LEFT JOIN address addr1 ON (addr1.id = t.address_id) " +
"LEFT JOIN address addr2 ON (addr2.id = t.address_id2) " +
"LEFT JOIN area area1 ON (area1.id = addr2.area_id) WHERE t.del = false AND addr1.del = false AND addr2.del = false AND area1.del = false " +
"AND (addr1.id = ? AND addr2.id = ? AND addr1.id = ?)");
MPJLambdaWrapper<UserDO> wrapper = JoinWrappers.lambda(UserDO.class)
.selectAll(UserDO.class)
.leftJoin(AddressDO.class, "addr1", AddressDO::getId, UserDO::getAddressId)
.leftJoin(AddressDO.class, "addr2", AddressDO::getId, UserDO::getAddressId2)
.leftJoin(AreaDO.class, "area1", AreaDO::getId, "addr2", AddressDO::getAreaId)
.eq("addr1", AddressDO::getId, 1)
.eq("addr2", AddressDO::getId, 2)
.eq("addr1", AddressDO::getId, 3);
List<UserDO> dos = userMapper.selectJoinList(UserDO.class, wrapper);
dos.forEach(System.out::println);
}
}