mirror of
https://gitee.com/best_handsome/mybatis-plus-join
synced 2025-07-11 00:02:22 +08:00
feat: 添加 applyFunc(), apply形式的"selectFunc"
This commit is contained in:
parent
6224140cc1
commit
93d3ab6e1c
@ -21,14 +21,13 @@ import com.github.yulichang.toolkit.sql.SqlScriptUtils;
|
|||||||
import com.github.yulichang.wrapper.enums.IfExistsSqlKeyWordEnum;
|
import com.github.yulichang.wrapper.enums.IfExistsSqlKeyWordEnum;
|
||||||
import com.github.yulichang.wrapper.enums.PrefixEnum;
|
import com.github.yulichang.wrapper.enums.PrefixEnum;
|
||||||
import com.github.yulichang.wrapper.interfaces.*;
|
import com.github.yulichang.wrapper.interfaces.*;
|
||||||
|
import com.github.yulichang.wrapper.segments.Fun;
|
||||||
|
import com.github.yulichang.wrapper.segments.FuncConsumer;
|
||||||
import lombok.Getter;
|
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.BiPredicate;
|
import java.util.function.*;
|
||||||
import java.util.function.Consumer;
|
|
||||||
import java.util.function.Predicate;
|
|
||||||
import java.util.function.Supplier;
|
|
||||||
|
|
||||||
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;
|
||||||
@ -330,6 +329,23 @@ public abstract class JoinAbstractWrapper<T, Children extends JoinAbstractWrappe
|
|||||||
() -> formatSqlMaybeWithParam(applySql, null, values)));
|
() -> formatSqlMaybeWithParam(applySql, null, values)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Children applyFunc(String applySql, Function<FuncConsumer, SFunction<?, ?>[]> consumerFunction, Object... values) {
|
||||||
|
return applyFunc(true, applySql, consumerFunction, values);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Children applyFunc(boolean condition, String applySql,
|
||||||
|
Function<FuncConsumer, SFunction<?, ?>[]> 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
|
@Override
|
||||||
public Children last(boolean condition, String lastSql) {
|
public Children last(boolean condition, String lastSql) {
|
||||||
if (condition) {
|
if (condition) {
|
||||||
|
@ -230,15 +230,15 @@ public interface Query<Children> extends Serializable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
default <X> Children selectFunc(String sql, Function<SelectFunc.Func, SFunction<?, ?>[]> column, String alias) {
|
default <X> Children selectFunc(String sql, Function<FuncConsumer, SFunction<?, ?>[]> column, String alias) {
|
||||||
getSelectColum().add(new SelectFunc(alias, getIndex(), () -> sql, column.apply(SelectFunc.Func.func),
|
getSelectColum().add(new SelectFunc(alias, getIndex(), () -> sql, column.apply(FuncConsumer.func),
|
||||||
isHasAlias(), getAlias()));
|
isHasAlias(), getAlias()));
|
||||||
return getChildren();
|
return getChildren();
|
||||||
}
|
}
|
||||||
|
|
||||||
default <X, S> Children selectFunc(String sql, Function<SelectFunc.Func, SFunction<?, ?>[]> column, SFunction<S, ?> alias) {
|
default <X, S> Children selectFunc(String sql, Function<FuncConsumer, SFunction<?, ?>[]> column, SFunction<S, ?> alias) {
|
||||||
getSelectColum().add(new SelectFunc(LambdaUtils.getName(alias), getIndex(), () -> sql,
|
getSelectColum().add(new SelectFunc(LambdaUtils.getName(alias), getIndex(), () -> sql,
|
||||||
column.apply(SelectFunc.Func.func), isHasAlias(), getAlias()));
|
column.apply(FuncConsumer.func), isHasAlias(), getAlias()));
|
||||||
return getChildren();
|
return getChildren();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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 <A> SFunction<?, ?>[] accept(SFunction<A, ?> a) {
|
||||||
|
return new SFunction[]{a};
|
||||||
|
}
|
||||||
|
|
||||||
|
public final <A, B> SFunction<?, ?>[] accept(SFunction<A, ?> a, SFunction<B, ?> b) {
|
||||||
|
return new SFunction[]{a, b};
|
||||||
|
}
|
||||||
|
|
||||||
|
public final <A, B, C> SFunction<?, ?>[] accept(SFunction<A, ?> a, SFunction<B, ?> b, SFunction<C, ?> c) {
|
||||||
|
return new SFunction[]{a, b, c};
|
||||||
|
}
|
||||||
|
|
||||||
|
public final <A, B, C, D> SFunction<?, ?>[] accept(SFunction<A, ?> a, SFunction<B, ?> b, SFunction<C, ?> c, SFunction<D, ?> d) {
|
||||||
|
return new SFunction[]{a, b, c, d};
|
||||||
|
}
|
||||||
|
|
||||||
|
public final <A, B, C, D, E> SFunction<?, ?>[] accept(SFunction<A, ?> a, SFunction<B, ?> b, SFunction<C, ?> c, SFunction<D, ?> d, SFunction<E, ?> e) {
|
||||||
|
return new SFunction[]{a, b, c, d, e};
|
||||||
|
}
|
||||||
|
|
||||||
|
public final <A, B, C, D, E, F> SFunction<?, ?>[] accept(SFunction<A, ?> a, SFunction<B, ?> b, SFunction<C, ?> c, SFunction<D, ?> d, SFunction<E, ?> e, SFunction<F, ?> f) {
|
||||||
|
return new SFunction[]{a, b, c, d, e, f};
|
||||||
|
}
|
||||||
|
|
||||||
|
public final <A, B, C, D, E, F, G> SFunction<?, ?>[] accept(SFunction<A, ?> a, SFunction<B, ?> b, SFunction<C, ?> c, SFunction<D, ?> d, SFunction<E, ?> e, SFunction<F, ?> f, SFunction<G, ?> g) {
|
||||||
|
return new SFunction[]{a, b, c, d, e, f, g};
|
||||||
|
}
|
||||||
|
|
||||||
|
public final <A, B, C, D, E, F, G, H> SFunction<?, ?>[] accept(SFunction<A, ?> a, SFunction<B, ?> b, SFunction<C, ?> c, SFunction<D, ?> d, SFunction<E, ?> e, SFunction<F, ?> f, SFunction<G, ?> g, SFunction<H, ?> h) {
|
||||||
|
return new SFunction[]{a, b, c, d, e, f, g, h};
|
||||||
|
}
|
||||||
|
|
||||||
|
public final <A, B, C, D, E, F, G, H, I> SFunction<?, ?>[] accept(SFunction<A, ?> a, SFunction<B, ?> b, SFunction<C, ?> c, SFunction<D, ?> d, SFunction<E, ?> e, SFunction<F, ?> f, SFunction<G, ?> g, SFunction<H, ?> h, SFunction<I, ?> i) {
|
||||||
|
return new SFunction[]{a, b, c, d, e, f, g, h, i};
|
||||||
|
}
|
||||||
|
|
||||||
|
public final <A, B, C, D, E, F, G, H, I, J> SFunction<?, ?>[] accept(SFunction<A, ?> a, SFunction<B, ?> b, SFunction<C, ?> c, SFunction<D, ?> d, SFunction<E, ?> e, SFunction<F, ?> f, SFunction<G, ?> g, SFunction<H, ?> h, SFunction<I, ?> i, SFunction<J, ?> j) {
|
||||||
|
return new SFunction[]{a, b, c, d, e, f, g, h, i, j};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -165,55 +165,4 @@ public class SelectFunc implements Select {
|
|||||||
private final boolean hasTableAlias;
|
private final boolean hasTableAlias;
|
||||||
private final String tableAlias;
|
private final String tableAlias;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 泛型不同不能使用可变参数
|
|
||||||
* 我想10个参数应该够了吧...
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unused")
|
|
||||||
public static class Func {
|
|
||||||
|
|
||||||
public static final Func func = new Func();
|
|
||||||
|
|
||||||
public final <A> SFunction<?, ?>[] accept(SFunction<A, ?> a) {
|
|
||||||
return new SFunction[]{a};
|
|
||||||
}
|
|
||||||
|
|
||||||
public final <A, B> SFunction<?, ?>[] accept(SFunction<A, ?> a, SFunction<B, ?> b) {
|
|
||||||
return new SFunction[]{a, b};
|
|
||||||
}
|
|
||||||
|
|
||||||
public final <A, B, C> SFunction<?, ?>[] accept(SFunction<A, ?> a, SFunction<B, ?> b, SFunction<C, ?> c) {
|
|
||||||
return new SFunction[]{a, b, c};
|
|
||||||
}
|
|
||||||
|
|
||||||
public final <A, B, C, D> SFunction<?, ?>[] accept(SFunction<A, ?> a, SFunction<B, ?> b, SFunction<C, ?> c, SFunction<D, ?> d) {
|
|
||||||
return new SFunction[]{a, b, c, d};
|
|
||||||
}
|
|
||||||
|
|
||||||
public final <A, B, C, D, E> SFunction<?, ?>[] accept(SFunction<A, ?> a, SFunction<B, ?> b, SFunction<C, ?> c, SFunction<D, ?> d, SFunction<E, ?> e) {
|
|
||||||
return new SFunction[]{a, b, c, d, e};
|
|
||||||
}
|
|
||||||
|
|
||||||
public final <A, B, C, D, E, F> SFunction<?, ?>[] accept(SFunction<A, ?> a, SFunction<B, ?> b, SFunction<C, ?> c, SFunction<D, ?> d, SFunction<E, ?> e, SFunction<F, ?> f) {
|
|
||||||
return new SFunction[]{a, b, c, d, e, f};
|
|
||||||
}
|
|
||||||
|
|
||||||
public final <A, B, C, D, E, F, G> SFunction<?, ?>[] accept(SFunction<A, ?> a, SFunction<B, ?> b, SFunction<C, ?> c, SFunction<D, ?> d, SFunction<E, ?> e, SFunction<F, ?> f, SFunction<G, ?> g) {
|
|
||||||
return new SFunction[]{a, b, c, d, e, f, g};
|
|
||||||
}
|
|
||||||
|
|
||||||
public final <A, B, C, D, E, F, G, H> SFunction<?, ?>[] accept(SFunction<A, ?> a, SFunction<B, ?> b, SFunction<C, ?> c, SFunction<D, ?> d, SFunction<E, ?> e, SFunction<F, ?> f, SFunction<G, ?> g, SFunction<H, ?> h) {
|
|
||||||
return new SFunction[]{a, b, c, d, e, f, g, h};
|
|
||||||
}
|
|
||||||
|
|
||||||
public final <A, B, C, D, E, F, G, H, I> SFunction<?, ?>[] accept(SFunction<A, ?> a, SFunction<B, ?> b, SFunction<C, ?> c, SFunction<D, ?> d, SFunction<E, ?> e, SFunction<F, ?> f, SFunction<G, ?> g, SFunction<H, ?> h, SFunction<I, ?> i) {
|
|
||||||
return new SFunction[]{a, b, c, d, e, f, g, h, i};
|
|
||||||
}
|
|
||||||
|
|
||||||
public final <A, B, C, D, E, F, G, H, I, J> SFunction<?, ?>[] accept(SFunction<A, ?> a, SFunction<B, ?> b, SFunction<C, ?> c, SFunction<D, ?> d, SFunction<E, ?> e, SFunction<F, ?> f, SFunction<G, ?> g, SFunction<H, ?> h, SFunction<I, ?> i, SFunction<J, ?> j) {
|
|
||||||
return new SFunction[]{a, b, c, d, e, f, g, h, j};
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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<UserDO> 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user