diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractWrapper.java index 9387de6..88a2145 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/JoinAbstractWrapper.java @@ -21,14 +21,13 @@ import com.github.yulichang.toolkit.sql.SqlScriptUtils; import com.github.yulichang.wrapper.enums.IfExistsSqlKeyWordEnum; import com.github.yulichang.wrapper.enums.PrefixEnum; import com.github.yulichang.wrapper.interfaces.*; +import com.github.yulichang.wrapper.segments.Fun; +import com.github.yulichang.wrapper.segments.FuncConsumer; import lombok.Getter; import java.util.*; import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.BiPredicate; -import java.util.function.Consumer; -import java.util.function.Predicate; -import java.util.function.Supplier; +import java.util.function.*; import static com.baomidou.mybatisplus.core.enums.SqlKeyword.*; import static com.baomidou.mybatisplus.core.enums.WrapperKeyword.APPLY; @@ -330,6 +329,23 @@ public abstract class JoinAbstractWrapper formatSqlMaybeWithParam(applySql, null, values))); } + public Children applyFunc(String applySql, Function[]> consumerFunction, Object... values) { + return applyFunc(true, applySql, consumerFunction, values); + } + + public Children applyFunc(boolean condition, String applySql, + Function[]> consumerFunction, Object... values) { + return maybeDo(condition, () -> appendSqlSegments(APPLY, + () -> formatSqlMaybeWithParam(String.format(applySql, + Arrays.stream(consumerFunction.apply(FuncConsumer.func)).map(func -> { + if (func instanceof Fun) { + Fun fun = (Fun) func; + return columnToString(index, fun.getAlias(), fun.getFunc(), false, PrefixEnum.CD_FIRST, false); + } + return columnToString(index, null, func, false, PrefixEnum.CD_FIRST, false); + }).toArray()), null, values))); + } + @Override public Children last(boolean condition, String lastSql) { if (condition) { diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java index 2a6d9a6..b096944 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java @@ -230,15 +230,15 @@ public interface Query extends Serializable { } - default Children selectFunc(String sql, Function[]> column, String alias) { - getSelectColum().add(new SelectFunc(alias, getIndex(), () -> sql, column.apply(SelectFunc.Func.func), + default Children selectFunc(String sql, Function[]> column, String alias) { + getSelectColum().add(new SelectFunc(alias, getIndex(), () -> sql, column.apply(FuncConsumer.func), isHasAlias(), getAlias())); return getChildren(); } - default Children selectFunc(String sql, Function[]> column, SFunction alias) { + default Children selectFunc(String sql, Function[]> column, SFunction alias) { getSelectColum().add(new SelectFunc(LambdaUtils.getName(alias), getIndex(), () -> sql, - column.apply(SelectFunc.Func.func), isHasAlias(), getAlias())); + column.apply(FuncConsumer.func), isHasAlias(), getAlias())); return getChildren(); } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/FuncConsumer.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/FuncConsumer.java new file mode 100644 index 0000000..5872904 --- /dev/null +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/FuncConsumer.java @@ -0,0 +1,56 @@ +package com.github.yulichang.wrapper.segments; + +import com.baomidou.mybatisplus.core.toolkit.support.SFunction; + +/** + * 用于selectFunc 和 applyFunc中的参数填充 + * 从原来的 {@link SelectFunc} 里的内部类中提取出来 + * + * @author yulichang + * @since 1.4.13 + */ +public class FuncConsumer { + + public static final FuncConsumer func = new FuncConsumer(); + + public final SFunction[] accept(SFunction a) { + return new SFunction[]{a}; + } + + public final SFunction[] accept(SFunction a, SFunction b) { + return new SFunction[]{a, b}; + } + + public final SFunction[] accept(SFunction a, SFunction b, SFunction c) { + return new SFunction[]{a, b, c}; + } + + public final SFunction[] accept(SFunction a, SFunction b, SFunction c, SFunction d) { + return new SFunction[]{a, b, c, d}; + } + + public final SFunction[] accept(SFunction a, SFunction b, SFunction c, SFunction d, SFunction e) { + return new SFunction[]{a, b, c, d, e}; + } + + public final SFunction[] accept(SFunction a, SFunction b, SFunction c, SFunction d, SFunction e, SFunction f) { + return new SFunction[]{a, b, c, d, e, f}; + } + + public final SFunction[] accept(SFunction a, SFunction b, SFunction c, SFunction d, SFunction e, SFunction f, SFunction g) { + return new SFunction[]{a, b, c, d, e, f, g}; + } + + public final SFunction[] accept(SFunction a, SFunction b, SFunction c, SFunction d, SFunction e, SFunction f, SFunction g, SFunction h) { + return new SFunction[]{a, b, c, d, e, f, g, h}; + } + + public final SFunction[] accept(SFunction a, SFunction b, SFunction c, SFunction d, SFunction e, SFunction f, SFunction g, SFunction h, SFunction i) { + return new SFunction[]{a, b, c, d, e, f, g, h, i}; + } + + public final SFunction[] accept(SFunction a, SFunction b, SFunction c, SFunction d, SFunction e, SFunction f, SFunction g, SFunction h, SFunction i, SFunction j) { + return new SFunction[]{a, b, c, d, e, f, g, h, i, j}; + } + +} diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectFunc.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectFunc.java index 8c0bf7d..aa70315 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectFunc.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/segments/SelectFunc.java @@ -165,55 +165,4 @@ public class SelectFunc implements Select { private final boolean hasTableAlias; private final String tableAlias; } - - /** - * 泛型不同不能使用可变参数 - * 我想10个参数应该够了吧... - */ - @SuppressWarnings("unused") - public static class Func { - - public static final Func func = new Func(); - - public final SFunction[] accept(SFunction a) { - return new SFunction[]{a}; - } - - public final SFunction[] accept(SFunction a, SFunction b) { - return new SFunction[]{a, b}; - } - - public final SFunction[] accept(SFunction a, SFunction b, SFunction c) { - return new SFunction[]{a, b, c}; - } - - public final SFunction[] accept(SFunction a, SFunction b, SFunction c, SFunction d) { - return new SFunction[]{a, b, c, d}; - } - - public final SFunction[] accept(SFunction a, SFunction b, SFunction c, SFunction d, SFunction e) { - return new SFunction[]{a, b, c, d, e}; - } - - public final SFunction[] accept(SFunction a, SFunction b, SFunction c, SFunction d, SFunction e, SFunction f) { - return new SFunction[]{a, b, c, d, e, f}; - } - - public final SFunction[] accept(SFunction a, SFunction b, SFunction c, SFunction d, SFunction e, SFunction f, SFunction g) { - return new SFunction[]{a, b, c, d, e, f, g}; - } - - public final SFunction[] accept(SFunction a, SFunction b, SFunction c, SFunction d, SFunction e, SFunction f, SFunction g, SFunction h) { - return new SFunction[]{a, b, c, d, e, f, g, h}; - } - - public final SFunction[] accept(SFunction a, SFunction b, SFunction c, SFunction d, SFunction e, SFunction f, SFunction g, SFunction h, SFunction i) { - return new SFunction[]{a, b, c, d, e, f, g, h, i}; - } - - public final SFunction[] accept(SFunction a, SFunction b, SFunction c, SFunction d, SFunction e, SFunction f, SFunction g, SFunction h, SFunction i, SFunction j) { - return new SFunction[]{a, b, c, d, e, f, g, h, j}; - } - - } } diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/ApplyFuncTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/ApplyFuncTest.java new file mode 100644 index 0000000..cfdb4bc --- /dev/null +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/ApplyFuncTest.java @@ -0,0 +1,44 @@ +package com.github.yulichang.test.join.m; + +import com.github.yulichang.test.join.entity.AddressDO; +import com.github.yulichang.test.join.entity.UserDO; +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.segments.Fun; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +@SpringBootTest +public class ApplyFuncTest { + + + @BeforeEach + void setUp() { + Reset.reset(); + } + + + @Test + void applyFunc() { + 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.user_id = t.id) WHERE t.del = false AND t1.del = false " + + "AND (concat(t.id, t1.user_id, ?) IS NOT NULL " + + "AND concat(t.id, t1.user_id, ?) IS NOT NULL)"); + List list = JoinWrappers.lambda(UserDO.class) + .selectAll(UserDO.class) + .leftJoin(AddressDO.class, AddressDO::getUserId, UserDO::getId) + .applyFunc("concat(%s,%s,{0}) is not null", arg -> arg.accept(UserDO::getId, AddressDO::getUserId), "12") + .applyFunc("concat(%s,%s,{0}) is not null", arg -> arg.accept( + Fun.f("t", UserDO::getId), + Fun.f("t1", AddressDO::getUserId)), "12") + .list(); + + list.forEach(System.out::println); + } + +}