diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/segments/FuncArgs.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/segments/FuncArgs.java index dfe52da..aa4f413 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/segments/FuncArgs.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/kt/segments/FuncArgs.java @@ -16,7 +16,7 @@ import java.util.Arrays; public class FuncArgs { public SelectFunc.Arg[] accept(KProperty... kProperty) { - return Arrays.stream(kProperty).map(i -> new SelectFunc.Arg(KtUtils.ref(i), i.getName())).toArray(SelectFunc.Arg[]::new); + return Arrays.stream(kProperty).map(i -> new SelectFunc.Arg(KtUtils.ref(i), i.getName(), false, null)).toArray(SelectFunc.Arg[]::new); } } diff --git a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java index 17367ec..c043b1e 100644 --- a/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java +++ b/mybatis-plus-join-core/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java @@ -367,10 +367,10 @@ public class MPJLambdaWrapper extends JoinAbstractLambdaWrapper { - String prefixByClass = tableList.getPrefixByClass(arg.getClazz()); + String pf = arg.isHasTableAlias() ? arg.getTableAlias() : tableList.getPrefixByClass(arg.getClazz()); Map mapField = ColumnCache.getMapField(arg.getClazz()); SelectCache cache = mapField.get(arg.getProp()); - return prefixByClass + StringPool.DOT + cache.getColumn(); + return pf + StringPool.DOT + cache.getColumn(); }).toArray()) + Constant.AS + i.getAlias(); } } else { 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 8a7e4dc..a624a20 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 @@ -201,28 +201,43 @@ public interface Query extends Serializable { return getChildren(); } + default Children selectFunc(BaseFuncEnum funcEnum, String index, SFunction column, String alias) { + Class aClass = LambdaUtils.getEntityClass(column); + Map cacheMap = ColumnCache.getMapField(aClass); + getSelectColum().add(new SelectFunc(cacheMap.get(LambdaUtils.getName(column)), getIndex(), alias, funcEnum, true, index)); + return getChildren(); + } + default Children selectFunc(BaseFuncEnum funcEnum, SFunction column, SFunction alias) { return selectFunc(funcEnum, column, LambdaUtils.getName(alias)); } + default Children selectFunc(BaseFuncEnum funcEnum, String index, SFunction column, SFunction alias) { + return selectFunc(funcEnum, index, column, LambdaUtils.getName(alias)); + } + default Children selectFunc(BaseFuncEnum funcEnum, SFunction column) { return selectFunc(funcEnum, column, column); } + default Children selectFunc(BaseFuncEnum funcEnum, String index, SFunction column) { + return selectFunc(funcEnum, index, column, column); + } + default Children selectFunc(BaseFuncEnum funcEnum, Object column, SFunction alias) { return selectFunc(funcEnum, column, LambdaUtils.getName(alias)); } default Children selectFunc(String sql, Function[]> column, String alias) { - getSelectColum().add(new SelectFunc(alias, getIndex(), () -> sql, column.apply(new SelectFunc.Func()), + getSelectColum().add(new SelectFunc(alias, getIndex(), () -> sql, column.apply(SelectFunc.Func.func), isHasAlias(), getAlias())); return getChildren(); } default Children selectFunc(String sql, Function[]> column, SFunction alias) { getSelectColum().add(new SelectFunc(LambdaUtils.getName(alias), getIndex(), () -> sql, - column.apply(new SelectFunc.Func()), isHasAlias(), getAlias())); + column.apply(SelectFunc.Func.func), isHasAlias(), getAlias())); return getChildren(); } 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 f7dc0e5..8c0bf7d 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 @@ -5,7 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.TableFieldInfo; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.toolkit.LambdaUtils; import com.github.yulichang.wrapper.enums.BaseFuncEnum; -import lombok.Data; +import lombok.AllArgsConstructor; import lombok.Getter; import org.apache.ibatis.type.TypeHandler; @@ -71,7 +71,15 @@ public class SelectFunc implements Select { public SelectFunc(String alias, Integer index, BaseFuncEnum func, SFunction[] args, boolean hasTableAlias, String tableAlias) { this.index = index; this.column = null; - this.args = Arrays.stream(args).map(i -> new Arg(LambdaUtils.getEntityClass(i), LambdaUtils.getName(i))).toArray(Arg[]::new); + this.args = Arrays.stream(args).map(i -> { + boolean ins = i instanceof Fun; + if (ins) { + Fun f = (Fun) i; + return new Arg(LambdaUtils.getEntityClass(f.getFunc()), LambdaUtils.getName(f.getFunc()), true, f.getAlias()); + } else { + return new Arg(LambdaUtils.getEntityClass(i), LambdaUtils.getName(i), false, null); + } + }).toArray(Arg[]::new); this.cache = null; this.hasAlias = true; this.alias = alias; @@ -149,16 +157,13 @@ public class SelectFunc implements Select { return false; } - @Data + @Getter + @AllArgsConstructor public static class Arg { - public Class clazz; - - public String prop; - - public Arg(Class clazz, String prop) { - this.clazz = clazz; - this.prop = prop; - } + private final Class clazz; + private final String prop; + private final boolean hasTableAlias; + private final String tableAlias; } /** @@ -168,6 +173,8 @@ public class SelectFunc implements Select { @SuppressWarnings("unused") public static class Func { + public static final Func func = new Func(); + public final SFunction[] accept(SFunction a) { return new SFunction[]{a}; } diff --git a/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/FuncAliasTest.java b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/FuncAliasTest.java new file mode 100644 index 0000000..32c3725 --- /dev/null +++ b/mybatis-plus-join-test/test-join/src/test/java/com/github/yulichang/test/join/m/FuncAliasTest.java @@ -0,0 +1,49 @@ +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.join.mapper.UserMapper; +import com.github.yulichang.test.util.Reset; +import com.github.yulichang.test.util.ThreadLocalUtils; +import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.github.yulichang.wrapper.segments.Fun; +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 org.springframework.jdbc.BadSqlGrammarException; + +@SpringBootTest +public class FuncAliasTest { + @Autowired + private UserMapper userMapper; + + @BeforeEach + void setUp() { + Reset.reset(); + } + + @Test + void funcAlias() { + 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, count(ad.id) AS id, count(addr.id) AS id, " + + "if(ad.user_id < 5, addr.user_id, ad.user_id + 100) AS id FROM `user` t " + + "LEFT JOIN address ad ON (ad.user_id = t.id) LEFT JOIN address addr ON (addr.user_id = t.id) " + + "WHERE t.del = false AND ad.del = false AND addr.del = false"); + MPJLambdaWrapper wrapper = new MPJLambdaWrapper() + .selectAll(UserDO.class) + .selectFunc(() -> "count(%s)", "ad", AddressDO::getId) + .selectFunc(() -> "count(%s)", "addr", AddressDO::getId) + .selectFunc("if(%s < 5,%s,%s + 100)", arg -> arg.accept( + Fun.f("ad", AddressDO::getUserId), + Fun.f("addr", AddressDO::getUserId), + Fun.f("ad", AddressDO::getUserId)), UserDO::getId) + .leftJoin(AddressDO.class, "ad", AddressDO::getUserId, UserDO::getId) + .leftJoin(AddressDO.class, "addr", AddressDO::getUserId, UserDO::getId); + + try { + userMapper.selectJoinList(UserDO.class, wrapper); + } catch (BadSqlGrammarException ignored) { + } + } +}