mirror of
https://gitee.com/best_handsome/mybatis-plus-join
synced 2025-07-11 00:02:22 +08:00
feat: join string sql support param
This commit is contained in:
parent
ce3548c7d2
commit
034c341f5c
@ -389,10 +389,10 @@ public abstract class AptAbstractWrapper<T, Children extends AptAbstractWrapper<
|
|||||||
* @param joinSql sql
|
* @param joinSql sql
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Children join(String keyWord, boolean condition, String joinSql) {
|
public Children join(String keyWord, boolean condition, String joinSql, Object... objects) {
|
||||||
if (condition) {
|
if (condition) {
|
||||||
Children wrapper = instanceEmpty();
|
Children wrapper = instanceEmpty();
|
||||||
wrapper.from.setStringValue(joinSql);
|
wrapper.from.setStringValue(formatSqlMaybeWithParam(joinSql, objects));
|
||||||
wrapper.keyWord = keyWord;
|
wrapper.keyWord = keyWord;
|
||||||
onWrappers.add(wrapper);
|
onWrappers.add(wrapper);
|
||||||
}
|
}
|
||||||
|
@ -198,7 +198,7 @@ public class AptQueryWrapper<T> extends AptAbstractWrapper<T, AptQueryWrapper<T>
|
|||||||
if (ArrayUtils.isEmpty(apply.getValues())) {
|
if (ArrayUtils.isEmpty(apply.getValues())) {
|
||||||
formatSql = sql;
|
formatSql = sql;
|
||||||
} else {
|
} else {
|
||||||
formatSql = formatSqlMaybeWithParam(sql, null, apply.getValues());
|
formatSql = formatSqlMaybeWithParam(sql, apply.getValues());
|
||||||
}
|
}
|
||||||
getSelectColum().add(new SelectApt(apply.getColumns(), () -> formatSql, alias));
|
getSelectColum().add(new SelectApt(apply.getColumns(), () -> formatSql, alias));
|
||||||
return typedThis;
|
return typedThis;
|
||||||
|
@ -33,6 +33,8 @@ import java.util.function.BiPredicate;
|
|||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import static com.baomidou.mybatisplus.core.enums.SqlKeyword.*;
|
import static com.baomidou.mybatisplus.core.enums.SqlKeyword.*;
|
||||||
@ -281,7 +283,7 @@ public abstract class JoinAbstractWrapper<T, Children extends JoinAbstractWrappe
|
|||||||
@Override
|
@Override
|
||||||
public Children apply(boolean condition, String applySql, Object... values) {
|
public Children apply(boolean condition, String applySql, Object... values) {
|
||||||
return maybeDo(condition, () -> appendSqlSegments(APPLY,
|
return maybeDo(condition, () -> appendSqlSegments(APPLY,
|
||||||
() -> formatSqlMaybeWithParam(applySql, null, values)));
|
() -> formatSqlMaybeWithParam(applySql, values)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Children applyFunc(String applySql, MFunction<AptConsumer> consumerFunction, Object... values) {
|
public Children applyFunc(String applySql, MFunction<AptConsumer> consumerFunction, Object... values) {
|
||||||
@ -294,7 +296,7 @@ public abstract class JoinAbstractWrapper<T, Children extends JoinAbstractWrappe
|
|||||||
() -> {
|
() -> {
|
||||||
AptConsumer apply = consumerFunction.apply(new AptConsumer());
|
AptConsumer apply = consumerFunction.apply(new AptConsumer());
|
||||||
return formatSqlMaybeWithParam(String.format(applySql,
|
return formatSqlMaybeWithParam(String.format(applySql,
|
||||||
Arrays.stream(apply.getColumns()).map(this::columnToString).toArray()), null,
|
Arrays.stream(apply.getColumns()).map(this::columnToString).toArray()),
|
||||||
ArrayUtils.isNotEmpty(values) ? values : apply.getValues());
|
ArrayUtils.isNotEmpty(values) ? values : apply.getValues());
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
@ -333,7 +335,7 @@ public abstract class JoinAbstractWrapper<T, Children extends JoinAbstractWrappe
|
|||||||
@Override
|
@Override
|
||||||
public Children exists(boolean condition, String existsSql, Object... values) {
|
public Children exists(boolean condition, String existsSql, Object... values) {
|
||||||
return maybeDo(condition, () -> appendSqlSegments(EXISTS,
|
return maybeDo(condition, () -> appendSqlSegments(EXISTS,
|
||||||
() -> String.format("(%s)", formatSqlMaybeWithParam(existsSql, null, values))));
|
() -> String.format("(%s)", formatSqlMaybeWithParam(existsSql, values))));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -481,7 +483,7 @@ public abstract class JoinAbstractWrapper<T, Children extends JoinAbstractWrappe
|
|||||||
@Override
|
@Override
|
||||||
public Children having(boolean condition, String sqlHaving, Object... params) {
|
public Children having(boolean condition, String sqlHaving, Object... params) {
|
||||||
return maybeDo(condition, () -> appendSqlSegments(HAVING,
|
return maybeDo(condition, () -> appendSqlSegments(HAVING,
|
||||||
() -> formatSqlMaybeWithParam(sqlHaving, null, params)));
|
() -> formatSqlMaybeWithParam(sqlHaving, params)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -573,21 +575,27 @@ public abstract class JoinAbstractWrapper<T, Children extends JoinAbstractWrappe
|
|||||||
* <p>
|
* <p>
|
||||||
* 支持 "{0}" 这种,或者 "sql {0} sql" 这种
|
* 支持 "{0}" 这种,或者 "sql {0} sql" 这种
|
||||||
*
|
*
|
||||||
* @param sqlStr 可能是sql片段
|
* @param sqlStr 可能是sql片段
|
||||||
* @param mapping 例如: "javaType=int,jdbcType=NUMERIC,typeHandler=xxx.xxx.MyTypeHandler" 这种
|
* @param params 参数
|
||||||
* @param params 参数
|
|
||||||
* @return sql片段
|
* @return sql片段
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("SameParameterValue")
|
protected final String formatSqlMaybeWithParam(String sqlStr, Object... params) {
|
||||||
protected final String formatSqlMaybeWithParam(String sqlStr, String mapping, Object... params) {
|
|
||||||
if (StrUtils.isBlank(sqlStr)) {
|
if (StrUtils.isBlank(sqlStr)) {
|
||||||
// todo 何时会这样?
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (ArrayUtils.isNotEmpty(params)) {
|
if (ArrayUtils.isNotEmpty(params)) {
|
||||||
for (int i = 0; i < params.length; ++i) {
|
for (int i = 0; i < params.length; ++i) {
|
||||||
final String target = Constants.LEFT_BRACE + i + Constants.RIGHT_BRACE;
|
String target = Constants.LEFT_BRACE + i + Constants.RIGHT_BRACE;
|
||||||
sqlStr = sqlStr.replace(target, formatParam(mapping, params[i]));
|
if (sqlStr.contains(target)) {
|
||||||
|
sqlStr = sqlStr.replace(target, formatParam(null, params[i]));
|
||||||
|
} else {
|
||||||
|
Matcher matcher = Pattern.compile("[{]" + i + ",[a-zA-Z0-9.,=]+}").matcher(sqlStr);
|
||||||
|
if (!matcher.find()) {
|
||||||
|
throw ExceptionUtils.mpe("Please check the syntax correctness! sql not contains: \"%s\"", target);
|
||||||
|
}
|
||||||
|
String group = matcher.group();
|
||||||
|
sqlStr = sqlStr.replace(group, formatParam(group.substring(target.length(), group.length() - 1), params[i]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return sqlStr;
|
return sqlStr;
|
||||||
|
@ -435,10 +435,10 @@ public abstract class KtAbstractLambdaWrapper<T, Children extends KtAbstractLamb
|
|||||||
* @param joinSql sql
|
* @param joinSql sql
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Children join(String keyWord, boolean condition, String joinSql) {
|
public Children join(String keyWord, boolean condition, String joinSql,Object... args) {
|
||||||
if (condition) {
|
if (condition) {
|
||||||
Children wrapper = instanceEmpty();
|
Children wrapper = instanceEmpty();
|
||||||
wrapper.from.setStringValue(joinSql);
|
wrapper.from.setStringValue(formatSqlMaybeWithParam(joinSql,args));
|
||||||
wrapper.keyWord = keyWord;
|
wrapper.keyWord = keyWord;
|
||||||
onWrappers.add(wrapper);
|
onWrappers.add(wrapper);
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,8 @@ import lombok.Getter;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.function.*;
|
import java.util.function.*;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import static com.baomidou.mybatisplus.core.enums.SqlKeyword.*;
|
import static com.baomidou.mybatisplus.core.enums.SqlKeyword.*;
|
||||||
import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.APPLY;
|
import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.APPLY;
|
||||||
@ -304,7 +306,7 @@ public abstract class KtAbstractWrapper<T, Children extends KtAbstractWrapper<T,
|
|||||||
@Override
|
@Override
|
||||||
public Children apply(boolean condition, String applySql, Object... values) {
|
public Children apply(boolean condition, String applySql, Object... values) {
|
||||||
return maybeDo(condition, () -> appendSqlSegments(APPLY,
|
return maybeDo(condition, () -> appendSqlSegments(APPLY,
|
||||||
() -> formatSqlMaybeWithParam(applySql, null, values)));
|
() -> formatSqlMaybeWithParam(applySql, values)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Children applyFunc(String applySql, Function<FuncArgs, SelectFunc.Arg[]> consumerFunction, Object... values) {
|
public Children applyFunc(String applySql, Function<FuncArgs, SelectFunc.Arg[]> consumerFunction, Object... values) {
|
||||||
@ -316,7 +318,8 @@ public abstract class KtAbstractWrapper<T, Children extends KtAbstractWrapper<T,
|
|||||||
return maybeDo(condition, () -> appendSqlSegments(APPLY,
|
return maybeDo(condition, () -> appendSqlSegments(APPLY,
|
||||||
() -> formatSqlMaybeWithParam(String.format(applySql,
|
() -> formatSqlMaybeWithParam(String.format(applySql,
|
||||||
Arrays.stream(consumerFunction.apply(new FuncArgs())).map(func ->
|
Arrays.stream(consumerFunction.apply(new FuncArgs())).map(func ->
|
||||||
columnToString(index, null, (KProperty<?>) func.getProperty(), false, PrefixEnum.CD_FIRST)).toArray()), null, values)));
|
columnToString(index, null, (KProperty<?>) func.getProperty(),
|
||||||
|
false, PrefixEnum.CD_FIRST)).toArray()), values)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -353,7 +356,7 @@ public abstract class KtAbstractWrapper<T, Children extends KtAbstractWrapper<T,
|
|||||||
@Override
|
@Override
|
||||||
public Children exists(boolean condition, String existsSql, Object... values) {
|
public Children exists(boolean condition, String existsSql, Object... values) {
|
||||||
return maybeDo(condition, () -> appendSqlSegments(EXISTS,
|
return maybeDo(condition, () -> appendSqlSegments(EXISTS,
|
||||||
() -> String.format("(%s)", formatSqlMaybeWithParam(existsSql, null, values))));
|
() -> String.format("(%s)", formatSqlMaybeWithParam(existsSql, values))));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -492,7 +495,7 @@ public abstract class KtAbstractWrapper<T, Children extends KtAbstractWrapper<T,
|
|||||||
@Override
|
@Override
|
||||||
public Children having(boolean condition, String sqlHaving, Object... params) {
|
public Children having(boolean condition, String sqlHaving, Object... params) {
|
||||||
return maybeDo(condition, () -> appendSqlSegments(HAVING,
|
return maybeDo(condition, () -> appendSqlSegments(HAVING,
|
||||||
() -> formatSqlMaybeWithParam(sqlHaving, null, params)));
|
() -> formatSqlMaybeWithParam(sqlHaving, params)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -591,21 +594,28 @@ public abstract class KtAbstractWrapper<T, Children extends KtAbstractWrapper<T,
|
|||||||
* <p>
|
* <p>
|
||||||
* 支持 "{0}" 这种,或者 "sql {0} sql" 这种
|
* 支持 "{0}" 这种,或者 "sql {0} sql" 这种
|
||||||
*
|
*
|
||||||
* @param sqlStr 可能是sql片段
|
* @param sqlStr 可能是sql片段
|
||||||
* @param mapping 例如: "javaType=int,jdbcType=NUMERIC,typeHandler=xxx.xxx.MyTypeHandler" 这种
|
* @param params 参数
|
||||||
* @param params 参数
|
|
||||||
* @return sql片段
|
* @return sql片段
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("SameParameterValue")
|
@SuppressWarnings("SameParameterValue")
|
||||||
protected final String formatSqlMaybeWithParam(String sqlStr, String mapping, Object... params) {
|
protected final String formatSqlMaybeWithParam(String sqlStr, Object... params) {
|
||||||
if (StrUtils.isBlank(sqlStr)) {
|
if (StrUtils.isBlank(sqlStr)) {
|
||||||
// todo 何时会这样?
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (ArrayUtils.isNotEmpty(params)) {
|
if (ArrayUtils.isNotEmpty(params)) {
|
||||||
for (int i = 0; i < params.length; ++i) {
|
for (int i = 0; i < params.length; ++i) {
|
||||||
final String target = Constants.LEFT_BRACE + i + Constants.RIGHT_BRACE;
|
String target = Constants.LEFT_BRACE + i + Constants.RIGHT_BRACE;
|
||||||
sqlStr = sqlStr.replace(target, formatParam(mapping, params[i]));
|
if (sqlStr.contains(target)) {
|
||||||
|
sqlStr = sqlStr.replace(target, formatParam(null, params[i]));
|
||||||
|
} else {
|
||||||
|
Matcher matcher = Pattern.compile("[{]" + i + ",[a-zA-Z0-9.,=]+}").matcher(sqlStr);
|
||||||
|
if (!matcher.find()) {
|
||||||
|
throw ExceptionUtils.mpe("Please check the syntax correctness! sql not contains: \"%s\"", target);
|
||||||
|
}
|
||||||
|
String group = matcher.group();
|
||||||
|
sqlStr = sqlStr.replace(group, formatParam(group.substring(target.length(), group.length() - 1), params[i]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return sqlStr;
|
return sqlStr;
|
||||||
|
@ -243,7 +243,7 @@ public class KtLambdaWrapper<T> extends KtAbstractLambdaWrapper<T, KtLambdaWrapp
|
|||||||
if (ArrayUtils.isEmpty(apply.getValues())) {
|
if (ArrayUtils.isEmpty(apply.getValues())) {
|
||||||
formatSql = sql;
|
formatSql = sql;
|
||||||
} else {
|
} else {
|
||||||
formatSql = formatSqlMaybeWithParam(sql, null, apply.getValues());
|
formatSql = formatSqlMaybeWithParam(sql, apply.getValues());
|
||||||
}
|
}
|
||||||
getSelectColum().add(new SelectFunc(alias, getIndex(), () -> formatSql, apply.getFuncArg(),
|
getSelectColum().add(new SelectFunc(alias, getIndex(), () -> formatSql, apply.getFuncArg(),
|
||||||
isHasAlias(), getAlias()));
|
isHasAlias(), getAlias()));
|
||||||
|
@ -24,6 +24,8 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
import java.util.function.BiPredicate;
|
import java.util.function.BiPredicate;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -391,10 +393,33 @@ public class MPJLambdaQueryWrapper<T> extends AbstractLambdaWrapper<T, MPJLambda
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MPJLambdaQueryWrapper<T> join(String keyWord, boolean condition, String joinSql) {
|
public MPJLambdaQueryWrapper<T> join(String keyWord, boolean condition, String joinSql, Object... args) {
|
||||||
if (condition) {
|
if (condition) {
|
||||||
from.setStringValue(from.getStringValue() + keyWord + joinSql);
|
from.setStringValue(from.getStringValue() + keyWord + mpjFormatSqlMaybeWithParam(joinSql, args));
|
||||||
}
|
}
|
||||||
return typedThis;
|
return typedThis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("DuplicatedCode")
|
||||||
|
protected final String mpjFormatSqlMaybeWithParam(String sqlStr, Object... params) {
|
||||||
|
if (StrUtils.isBlank(sqlStr)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (ArrayUtils.isNotEmpty(params)) {
|
||||||
|
for (int i = 0; i < params.length; ++i) {
|
||||||
|
String target = Constants.LEFT_BRACE + i + Constants.RIGHT_BRACE;
|
||||||
|
if (sqlStr.contains(target)) {
|
||||||
|
sqlStr = sqlStr.replace(target, formatParam(null, params[i]));
|
||||||
|
} else {
|
||||||
|
Matcher matcher = Pattern.compile("[{]" + i + ",[a-zA-Z0-9.,=]+}").matcher(sqlStr);
|
||||||
|
if (!matcher.find()) {
|
||||||
|
throw ExceptionUtils.mpe("Please check the syntax correctness! sql not contains: \"%s\"", target);
|
||||||
|
}
|
||||||
|
String group = matcher.group();
|
||||||
|
sqlStr = sqlStr.replace(group, formatParam(group.substring(target.length(), group.length() - 1), params[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sqlStr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,6 +31,8 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
import java.util.function.BiPredicate;
|
import java.util.function.BiPredicate;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -408,10 +410,34 @@ public class MPJQueryWrapper<T> extends AbstractWrapper<T, String, MPJQueryWrapp
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public MPJQueryWrapper<T> join(String keyWord, boolean condition, String joinSql) {
|
public MPJQueryWrapper<T> join(String keyWord, boolean condition, String joinSql, Object... params) {
|
||||||
if (condition) {
|
if (condition) {
|
||||||
from.setStringValue(from.getStringValue() + StringPool.SPACE + keyWord + StringPool.SPACE + joinSql);
|
from.setStringValue(from.getStringValue() + StringPool.SPACE + keyWord +
|
||||||
|
StringPool.SPACE + mpjFormatSqlMaybeWithParam(joinSql, params));
|
||||||
}
|
}
|
||||||
return typedThis;
|
return typedThis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("DuplicatedCode")
|
||||||
|
protected final String mpjFormatSqlMaybeWithParam(String sqlStr, Object... params) {
|
||||||
|
if (StrUtils.isBlank(sqlStr)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
if (ArrayUtils.isNotEmpty(params)) {
|
||||||
|
for (int i = 0; i < params.length; ++i) {
|
||||||
|
String target = Constants.LEFT_BRACE + i + Constants.RIGHT_BRACE;
|
||||||
|
if (sqlStr.contains(target)) {
|
||||||
|
sqlStr = sqlStr.replace(target, formatParam(null, params[i]));
|
||||||
|
} else {
|
||||||
|
Matcher matcher = Pattern.compile("[{]" + i + ",[a-zA-Z0-9.,=]+}").matcher(sqlStr);
|
||||||
|
if (!matcher.find()) {
|
||||||
|
throw ExceptionUtils.mpe("Please check the syntax correctness! sql not contains: \"%s\"", target);
|
||||||
|
}
|
||||||
|
String group = matcher.group();
|
||||||
|
sqlStr = sqlStr.replace(group, formatParam(group.substring(target.length(), group.length() - 1), params[i]));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sqlStr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -16,10 +16,19 @@ public interface StringJoin<Children, T> extends MPJBaseJoin<T> {
|
|||||||
return leftJoin(true, joinSql);
|
return leftJoin(true, joinSql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default Children leftJoin(String joinSql, Object... args) {
|
||||||
|
return leftJoin(true, joinSql, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
default Children leftJoin(boolean condition, String joinSql) {
|
default Children leftJoin(boolean condition, String joinSql) {
|
||||||
return join(Constant.LEFT_JOIN, condition, joinSql);
|
return join(Constant.LEFT_JOIN, condition, joinSql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default Children leftJoin(boolean condition, String joinSql, Object... args) {
|
||||||
|
return join(Constant.LEFT_JOIN, condition, joinSql, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* right join
|
* right join
|
||||||
@ -28,10 +37,17 @@ public interface StringJoin<Children, T> extends MPJBaseJoin<T> {
|
|||||||
return rightJoin(true, joinSql);
|
return rightJoin(true, joinSql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default Children rightJoin(String joinSql, Object... args) {
|
||||||
|
return rightJoin(true, joinSql, args);
|
||||||
|
}
|
||||||
|
|
||||||
default Children rightJoin(boolean condition, String joinSql) {
|
default Children rightJoin(boolean condition, String joinSql) {
|
||||||
return join(Constant.RIGHT_JOIN, condition, joinSql);
|
return join(Constant.RIGHT_JOIN, condition, joinSql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default Children rightJoin(boolean condition, String joinSql, Object... args) {
|
||||||
|
return join(Constant.RIGHT_JOIN, condition, joinSql, args);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* inner join
|
* inner join
|
||||||
@ -40,10 +56,18 @@ public interface StringJoin<Children, T> extends MPJBaseJoin<T> {
|
|||||||
return innerJoin(true, joinSql);
|
return innerJoin(true, joinSql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default Children innerJoin(String joinSql, Object... args) {
|
||||||
|
return innerJoin(true, joinSql, args);
|
||||||
|
}
|
||||||
|
|
||||||
default Children innerJoin(boolean condition, String joinSql) {
|
default Children innerJoin(boolean condition, String joinSql) {
|
||||||
return join(Constant.INNER_JOIN, condition, joinSql);
|
return join(Constant.INNER_JOIN, condition, joinSql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default Children innerJoin(boolean condition, String joinSql, Object... args) {
|
||||||
|
return join(Constant.INNER_JOIN, condition, joinSql, args);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* full join
|
* full join
|
||||||
*/
|
*/
|
||||||
@ -51,9 +75,23 @@ public interface StringJoin<Children, T> extends MPJBaseJoin<T> {
|
|||||||
return fullJoin(true, joinSql);
|
return fullJoin(true, joinSql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
default Children fullJoin(String joinSql, Object... args) {
|
||||||
|
return fullJoin(true, joinSql, args);
|
||||||
|
}
|
||||||
|
|
||||||
default Children fullJoin(boolean condition, String joinSql) {
|
default Children fullJoin(boolean condition, String joinSql) {
|
||||||
return join(Constant.FULL_JOIN, condition, joinSql);
|
return join(Constant.FULL_JOIN, condition, joinSql);
|
||||||
}
|
}
|
||||||
|
|
||||||
Children join(String keyWord, boolean condition, String joinSql);
|
default Children fullJoin(boolean condition, String joinSql, Object... args) {
|
||||||
|
return join(Constant.FULL_JOIN, condition, joinSql, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
default Children join(String keyWord, boolean condition, String joinSql) {
|
||||||
|
return join(keyWord, condition, joinSql, new Object[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
default Children join(String keyWord, boolean condition, String joinSql, Object... args){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -488,10 +488,10 @@ public abstract class JoinAbstractLambdaWrapper<T, Children extends JoinAbstract
|
|||||||
* @param joinSql sql
|
* @param joinSql sql
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Children join(String keyWord, boolean condition, String joinSql) {
|
public Children join(String keyWord, boolean condition, String joinSql, Object... args) {
|
||||||
if (condition) {
|
if (condition) {
|
||||||
Children wrapper = instanceEmpty();
|
Children wrapper = instanceEmpty();
|
||||||
wrapper.from.setStringValue(joinSql);
|
wrapper.from.setStringValue(formatSqlMaybeWithParam(joinSql, args));
|
||||||
wrapper.keyWord = keyWord;
|
wrapper.keyWord = keyWord;
|
||||||
onWrappers.add(wrapper);
|
onWrappers.add(wrapper);
|
||||||
}
|
}
|
||||||
|
@ -28,6 +28,8 @@ import java.util.function.BiPredicate;
|
|||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import static com.baomidou.mybatisplus.core.enums.SqlKeyword.*;
|
import static com.baomidou.mybatisplus.core.enums.SqlKeyword.*;
|
||||||
import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.APPLY;
|
import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.APPLY;
|
||||||
@ -396,7 +398,7 @@ public abstract class JoinAbstractWrapper<T, Children extends JoinAbstractWrappe
|
|||||||
@Override
|
@Override
|
||||||
public Children apply(boolean condition, String applySql, Object... values) {
|
public Children apply(boolean condition, String applySql, Object... values) {
|
||||||
return maybeDo(condition, () -> appendSqlSegments(APPLY,
|
return maybeDo(condition, () -> appendSqlSegments(APPLY,
|
||||||
() -> formatSqlMaybeWithParam(applySql, null, values)));
|
() -> formatSqlMaybeWithParam(applySql, values)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Children applyFunc(String applySql, MFunction<FuncConsumer> consumerFunction, Object... values) {
|
public Children applyFunc(String applySql, MFunction<FuncConsumer> consumerFunction, Object... values) {
|
||||||
@ -415,7 +417,7 @@ public abstract class JoinAbstractWrapper<T, Children extends JoinAbstractWrappe
|
|||||||
return columnToString(index, fun.getAlias(), fun.getFunc(), false, PrefixEnum.CD_FIRST, false);
|
return columnToString(index, fun.getAlias(), fun.getFunc(), false, PrefixEnum.CD_FIRST, false);
|
||||||
}
|
}
|
||||||
return columnToString(index, null, func, false, PrefixEnum.CD_FIRST, false);
|
return columnToString(index, null, func, false, PrefixEnum.CD_FIRST, false);
|
||||||
}).toArray()), null, ArrayUtils.isEmpty(values) ? funcConsumer.getValues() : values);
|
}).toArray()), ArrayUtils.isEmpty(values) ? funcConsumer.getValues() : values);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -453,7 +455,7 @@ public abstract class JoinAbstractWrapper<T, Children extends JoinAbstractWrappe
|
|||||||
@Override
|
@Override
|
||||||
public Children exists(boolean condition, String existsSql, Object... values) {
|
public Children exists(boolean condition, String existsSql, Object... values) {
|
||||||
return maybeDo(condition, () -> appendSqlSegments(EXISTS,
|
return maybeDo(condition, () -> appendSqlSegments(EXISTS,
|
||||||
() -> String.format("(%s)", formatSqlMaybeWithParam(existsSql, null, values))));
|
() -> String.format("(%s)", formatSqlMaybeWithParam(existsSql, values))));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -727,7 +729,7 @@ public abstract class JoinAbstractWrapper<T, Children extends JoinAbstractWrappe
|
|||||||
@Override
|
@Override
|
||||||
public Children having(boolean condition, String sqlHaving, Object... params) {
|
public Children having(boolean condition, String sqlHaving, Object... params) {
|
||||||
return maybeDo(condition, () -> appendSqlSegments(HAVING,
|
return maybeDo(condition, () -> appendSqlSegments(HAVING,
|
||||||
() -> formatSqlMaybeWithParam(sqlHaving, null, params)));
|
() -> formatSqlMaybeWithParam(sqlHaving, params)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -831,21 +833,27 @@ public abstract class JoinAbstractWrapper<T, Children extends JoinAbstractWrappe
|
|||||||
* <p>
|
* <p>
|
||||||
* 支持 "{0}" 这种,或者 "sql {0} sql" 这种
|
* 支持 "{0}" 这种,或者 "sql {0} sql" 这种
|
||||||
*
|
*
|
||||||
* @param sqlStr 可能是sql片段
|
* @param sqlStr 可能是sql片段
|
||||||
* @param mapping 例如: "javaType=int,jdbcType=NUMERIC,typeHandler=xxx.xxx.MyTypeHandler" 这种
|
* @param params 参数
|
||||||
* @param params 参数
|
|
||||||
* @return sql片段
|
* @return sql片段
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("SameParameterValue")
|
protected final String formatSqlMaybeWithParam(String sqlStr, Object... params) {
|
||||||
protected final String formatSqlMaybeWithParam(String sqlStr, String mapping, Object... params) {
|
|
||||||
if (StrUtils.isBlank(sqlStr)) {
|
if (StrUtils.isBlank(sqlStr)) {
|
||||||
// todo 何时会这样?
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
if (ArrayUtils.isNotEmpty(params)) {
|
if (ArrayUtils.isNotEmpty(params)) {
|
||||||
for (int i = 0; i < params.length; ++i) {
|
for (int i = 0; i < params.length; ++i) {
|
||||||
final String target = Constants.LEFT_BRACE + i + Constants.RIGHT_BRACE;
|
String target = Constants.LEFT_BRACE + i + Constants.RIGHT_BRACE;
|
||||||
sqlStr = sqlStr.replace(target, formatParam(mapping, params[i]));
|
if (sqlStr.contains(target)) {
|
||||||
|
sqlStr = sqlStr.replace(target, formatParam(null, params[i]));
|
||||||
|
} else {
|
||||||
|
Matcher matcher = Pattern.compile("[{]" + i + ",[a-zA-Z0-9.,=]+}").matcher(sqlStr);
|
||||||
|
if (!matcher.find()) {
|
||||||
|
throw ExceptionUtils.mpe("Please check the syntax correctness! sql not contains: \"%s\"", target);
|
||||||
|
}
|
||||||
|
String group = matcher.group();
|
||||||
|
sqlStr = sqlStr.replace(group, formatParam(group.substring(target.length(), group.length() - 1), params[i]));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return sqlStr;
|
return sqlStr;
|
||||||
|
@ -231,7 +231,7 @@ public class MPJLambdaWrapper<T> extends JoinAbstractLambdaWrapper<T, MPJLambdaW
|
|||||||
if (ArrayUtils.isEmpty(funcConsumer.getValues())) {
|
if (ArrayUtils.isEmpty(funcConsumer.getValues())) {
|
||||||
formatSql = sql;
|
formatSql = sql;
|
||||||
} else {
|
} else {
|
||||||
formatSql = formatSqlMaybeWithParam(sql, null, funcConsumer.getValues());
|
formatSql = formatSqlMaybeWithParam(sql, funcConsumer.getValues());
|
||||||
}
|
}
|
||||||
getSelectColum().add(new SelectFunc(alias, getIndex(), () -> formatSql,
|
getSelectColum().add(new SelectFunc(alias, getIndex(), () -> formatSql,
|
||||||
funcConsumer.getArgs(), isHasAlias(), getAlias()));
|
funcConsumer.getArgs(), isHasAlias(), getAlias()));
|
||||||
|
@ -165,7 +165,7 @@ public class UpdateJoinWrapper<T> extends JoinAbstractLambdaWrapper<T, UpdateJoi
|
|||||||
String col = String.format(i.format, Arrays.stream(i.columns).map(f ->
|
String col = String.format(i.format, Arrays.stream(i.columns).map(f ->
|
||||||
tableList.getPrefixByClass(LambdaUtils.getEntityClass(f)) +
|
tableList.getPrefixByClass(LambdaUtils.getEntityClass(f)) +
|
||||||
Constants.DOT + getCache(f).getColumn()).toArray());
|
Constants.DOT + getCache(f).getColumn()).toArray());
|
||||||
return formatSqlMaybeWithParam(col, null, i.args);
|
return formatSqlMaybeWithParam(col, i.args);
|
||||||
} else {
|
} else {
|
||||||
String col = tableList.getPrefixByClass(LambdaUtils.getEntityClass(i.getColumn())) +
|
String col = tableList.getPrefixByClass(LambdaUtils.getEntityClass(i.getColumn())) +
|
||||||
Constants.DOT + getCache(i.getColumn()).getColumn();
|
Constants.DOT + getCache(i.getColumn()).getColumn();
|
||||||
|
@ -92,6 +92,38 @@ public class JoinTest {
|
|||||||
.list(UserDTO.class);
|
.list(UserDTO.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void joinTest2() {
|
||||||
|
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 t1 ON t1.id > ?
|
||||||
|
WHERE t.del = false AND (t.id <= ?)
|
||||||
|
""");
|
||||||
|
JoinWrappers.lambda(UserDO.class)
|
||||||
|
.selectAll()
|
||||||
|
.leftJoin("address t1 on t1.id > {0}", 0)
|
||||||
|
.le(AddressDO::getId, 10000)
|
||||||
|
.list(UserDTO.class);
|
||||||
|
|
||||||
|
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 t1 ON t1.id > 0
|
||||||
|
WHERE t.del = false AND (t.id <= ?)
|
||||||
|
""");
|
||||||
|
JoinWrappers.lambda(UserDO.class)
|
||||||
|
.selectAll()
|
||||||
|
.leftJoin("address t1 on t1.id > 0")
|
||||||
|
.le(AddressDO::getId, 10000)
|
||||||
|
.list(UserDTO.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user