diff --git a/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java b/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java
index 9b21152..0fa4cdc 100644
--- a/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java
+++ b/src/main/java/com/github/yulichang/interceptor/MPJInterceptor.java
@@ -25,8 +25,6 @@ import org.apache.ibatis.type.TypeHandler;
import org.apache.ibatis.type.TypeHandlerRegistry;
import org.apache.ibatis.type.UnknownTypeHandler;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
@@ -110,17 +108,7 @@ public class MPJInterceptor implements Interceptor {
*/
private ResultMap newResultMap(MappedStatement ms, Class> resultType) {
TableInfo tableInfo = TableInfoHelper.getTableInfo(resultType);
- if (tableInfo != null && tableInfo.isAutoInitResultMap()) {
- if (tableInfo.getEntityType() != resultType) {
- try {
- Method info = TableInfoHelper.class.getDeclaredMethod("initTableInfo", Configuration.class, String.class, Class.class);
- info.setAccessible(true);
- Object invoke = info.invoke(TableInfoHelper.class, ms.getConfiguration(), ms.getId().substring(0, ms.getId().lastIndexOf(".")), resultType);
- tableInfo = (TableInfo) invoke;
- } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
- e.printStackTrace();
- }
- }
+ if (tableInfo != null && tableInfo.isAutoInitResultMap() && tableInfo.getEntityType() == resultType) {
return initResultMapIfNeed(tableInfo, resultType);
}
return new ResultMap.Builder(ms.getConfiguration(), ms.getId(), resultType, EMPTY_RESULT_MAPPING).build();
diff --git a/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java b/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java
new file mode 100644
index 0000000..733b652
--- /dev/null
+++ b/src/main/java/com/github/yulichang/query/MPJLambdaQueryWrapper.java
@@ -0,0 +1,251 @@
+package com.github.yulichang.query;
+
+import com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper;
+import com.baomidou.mybatisplus.core.conditions.SharedString;
+import com.baomidou.mybatisplus.core.conditions.query.Query;
+import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;
+import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
+import com.baomidou.mybatisplus.core.metadata.TableInfo;
+import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
+import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
+import com.github.yulichang.query.interfaces.MPJJoin;
+import com.github.yulichang.toolkit.Constant;
+import org.springframework.util.Assert;
+
+import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+/**
+ * 不推荐使用这wrapper
+ * 这种既有string又有lambda对开发人员并不友好
+ *
+ * 推荐使用以下两个类 :
+ * String -> {@link MPJQueryWrapper}
+ * lambda -> {@link com.github.yulichang.wrapper.MPJLambdaWrapper}
+ *
+ *
+ * @author yulichang
+ */
+@Deprecated
+@SuppressWarnings("DeprecatedIsStillUsed")
+public class MPJLambdaQueryWrapper extends AbstractLambdaWrapper>
+ implements Query, T, SFunction>, MPJJoin> {
+
+ /**
+ * 查询字段
+ */
+ private SharedString sqlSelect = new SharedString();
+
+ /**
+ * 连表字段
+ */
+ private SharedString from = SharedString.emptyString();
+
+ /**
+ * 主表别名
+ */
+ private final SharedString alias = new SharedString(Constant.TABLE_ALIAS);
+
+ /**
+ * 查询的列
+ */
+ private List selectColumns = new ArrayList<>();
+
+ /**
+ * 排除的字段
+ */
+ private List ignoreColumns = new ArrayList<>();
+
+ /**
+ * 不建议直接 new 该实例,使用 Wrappers.lambdaQuery(entity)
+ */
+ public MPJLambdaQueryWrapper() {
+ super.initNeed();
+ }
+
+ /**
+ * 不建议直接 new 该实例,使用 Wrappers.lambdaQuery(...)
+ */
+ MPJLambdaQueryWrapper(T entity, Class entityClass, SharedString from, SharedString sqlSelect, AtomicInteger paramNameSeq,
+ Map paramNameValuePairs, MergeSegments mergeSegments,
+ SharedString lastSql, SharedString sqlComment, SharedString sqlFirst,
+ List selectColumns, List ignoreColumns) {
+ super.setEntity(entity);
+ super.setEntityClass(entityClass);
+ this.paramNameSeq = paramNameSeq;
+ this.paramNameValuePairs = paramNameValuePairs;
+ this.expression = mergeSegments;
+ this.sqlSelect = sqlSelect;
+ this.from = from;
+ this.lastSql = lastSql;
+ this.sqlComment = sqlComment;
+ this.sqlFirst = sqlFirst;
+ this.selectColumns = selectColumns;
+ this.ignoreColumns = ignoreColumns;
+ }
+
+ /**
+ * SELECT 部分 SQL 设置
+ *
+ * @param columns 查询字段
+ */
+ @SafeVarargs
+ public final MPJLambdaQueryWrapper select(SFunction... columns) {
+ if (ArrayUtils.isNotEmpty(columns)) {
+ for (SFunction s : columns) {
+ selectColumns.add(columnToString(s, false));
+ }
+ }
+ return typedThis;
+ }
+
+ /**
+ * 忽略查询字段
+ *
+ * 用法: selectIgnore("t.id","t.sex","a.area")
+ *
+ * @since 1.1.3
+ */
+ public MPJLambdaQueryWrapper selectIgnore(String... columns) {
+ if (ArrayUtils.isNotEmpty(columns)) {
+ ignoreColumns.addAll(Arrays.asList(columns));
+ }
+ return typedThis;
+ }
+
+ /**
+ * 忽略查询字段
+ *
+ * 用法: selectIgnore("t.id","t.sex","a.area")
+ *
+ * @since 1.1.3
+ */
+ @SafeVarargs
+ public final MPJLambdaQueryWrapper selectIgnore(SFunction... columns) {
+ if (ArrayUtils.isNotEmpty(columns)) {
+ for (SFunction s : columns) {
+ ignoreColumns.add(Constant.TABLE_ALIAS + StringPool.DOT + getColumnCache(s).getColumn());
+ }
+ }
+ return typedThis;
+ }
+
+ @Override
+ protected String columnToString(SFunction column, boolean onlyColumn) {
+ return Constant.TABLE_ALIAS + StringPool.DOT + super.columnToString(column, onlyColumn);
+ }
+
+ public MPJLambdaQueryWrapper select(String... columns) {
+ if (ArrayUtils.isNotEmpty(columns)) {
+ Collections.addAll(selectColumns, columns);
+ }
+ return typedThis;
+ }
+
+ /**
+ * 只针对主表
+ *
+ * 过滤查询的字段信息(主键除外!)
+ *
例1: 只要 java 字段名以 "test" 开头的 -> select(i -> i.getProperty().startsWith("test"))
+ * 例2: 只要 java 字段属性是 CharSequence 类型的 -> select(TableFieldInfo::isCharSequence)
+ * 例3: 只要 java 字段没有填充策略的 -> select(i -> i.getFieldFill() == FieldFill.DEFAULT)
+ * 例4: 要全部字段 -> select(i -> true)
+ * 例5: 只要主键字段 -> select(i -> false)
+ *
+ * @param predicate 过滤方式
+ * @return this
+ */
+ @Override
+ public MPJLambdaQueryWrapper select(Class entityClass, Predicate predicate) {
+ TableInfo info = TableInfoHelper.getTableInfo(entityClass);
+ Assert.notNull(info, "can not find table info");
+ selectColumns.addAll(info.getFieldList().stream().filter(predicate).map(c ->
+ Constant.TABLE_ALIAS + StringPool.DOT + c.getColumn()).collect(Collectors.toList()));
+ return typedThis;
+ }
+
+
+ /**
+ * 查询主表全部字段
+ *
+ * @param clazz 主表class
+ */
+ public final MPJLambdaQueryWrapper selectAll(Class clazz) {
+ return selectAll(clazz, Constant.TABLE_ALIAS);
+ }
+
+ /**
+ * 查询表全部字段
+ *
+ * @param clazz 表实体
+ * @param as 表别名
+ */
+ public final MPJLambdaQueryWrapper selectAll(Class> clazz, String as) {
+ TableInfo info = TableInfoHelper.getTableInfo(clazz);
+ Assert.notNull(info, "can not find table info");
+ if (info.havePK()) {
+ selectColumns.add(as + StringPool.DOT + info.getKeyColumn());
+ }
+ selectColumns.addAll(info.getFieldList().stream().map(i ->
+ as + StringPool.DOT + i.getColumn()).collect(Collectors.toList()));
+ return typedThis;
+ }
+
+ /**
+ * 返回一个支持 lambda 函数写法的 wrapper
+ */
+ public MPJQueryWrapper stringQuery() {
+ return new MPJQueryWrapper<>(getEntity(), getEntityClass(), paramNameSeq, paramNameValuePairs,
+ expression, sqlSelect, from, lastSql, sqlComment, sqlFirst, selectColumns, ignoreColumns);
+ }
+
+ @Override
+ public String getSqlSelect() {
+ if (StringUtils.isBlank(sqlSelect.getStringValue())) {
+ if (CollectionUtils.isNotEmpty(ignoreColumns)) {
+ selectColumns.removeIf(ignoreColumns::contains);
+ }
+ sqlSelect.setStringValue(String.join(StringPool.COMMA, selectColumns));
+ }
+ return sqlSelect.getStringValue();
+ }
+
+ public String getFrom() {
+ return from.getStringValue();
+ }
+
+
+ public String getAlias() {
+ return alias.getStringValue();
+ }
+
+ /**
+ * 用于生成嵌套 sql
+ * 故 sqlSelect selectColumn ignoreColumns from不向下传递
+ */
+ @Override
+ protected MPJLambdaQueryWrapper instance() {
+ return new MPJLambdaQueryWrapper<>(getEntity(), getEntityClass(), null, null, paramNameSeq, paramNameValuePairs,
+ new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString(), null, null);
+ }
+
+ @Override
+ public void clear() {
+ super.clear();
+ sqlSelect.toNull();
+ }
+
+ @Override
+ public MPJLambdaQueryWrapper join(String keyWord, boolean condition, String joinSql) {
+ if (condition) {
+ from.setStringValue(from.getStringValue() + keyWord + joinSql);
+ }
+ return typedThis;
+ }
+}
diff --git a/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java b/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java
index 5bd34b5..834d090 100644
--- a/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java
+++ b/src/main/java/com/github/yulichang/query/MPJQueryWrapper.java
@@ -172,6 +172,13 @@ public class MPJQueryWrapper extends AbstractWrapper lambda() {
+ return new MPJLambdaQueryWrapper<>(getEntity(), getEntityClass(), from, sqlSelect, paramNameSeq, paramNameValuePairs,
+ expression, lastSql, sqlComment, sqlFirst, selectColumns, ignoreColumns);
+ }
/**
* 用于生成嵌套 sql
diff --git a/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java b/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java
index 37844d7..c1c6c71 100644
--- a/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java
+++ b/src/main/java/com/github/yulichang/wrapper/MPJAbstractLambdaWrapper.java
@@ -14,7 +14,9 @@ import java.util.Objects;
import static java.util.stream.Collectors.joining;
/**
- * copy {@link com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper}
+ * 参考 {@link com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper}
+ *
+ * @author yulichang
*/
@SuppressWarnings("serial")
public abstract class MPJAbstractLambdaWrapper>
@@ -49,10 +51,10 @@ public abstract class MPJAbstractLambdaWrapper aClass = LambdaUtils.getEntityClass(fn);
Map cacheMap = columnMap.get(aClass);
if (cacheMap == null) {
- cacheMap = com.baomidou.mybatisplus.core.toolkit.LambdaUtils.getColumnMap(aClass);
+ cacheMap = LambdaUtils.getColumnMap(aClass);
columnMap.put(aClass, cacheMap);
}
- return cacheMap.get(com.baomidou.mybatisplus.core.toolkit.LambdaUtils.formatKey(LambdaUtils.getName(fn)));
+ return cacheMap.get(LambdaUtils.formatKey(LambdaUtils.getName(fn)));
}
protected String getDefault(Integer i) {
diff --git a/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java b/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java
index 47cad4f..418b7ff 100644
--- a/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java
+++ b/src/main/java/com/github/yulichang/wrapper/MPJLambdaWrapper.java
@@ -8,8 +8,10 @@ import com.baomidou.mybatisplus.core.metadata.TableInfoHelper;
import com.baomidou.mybatisplus.core.toolkit.*;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.github.yulichang.toolkit.Constant;
+import com.github.yulichang.toolkit.LambdaUtils;
+import com.github.yulichang.wrapper.enums.BaseFuncEnum;
import com.github.yulichang.wrapper.interfaces.LambdaJoin;
-import com.github.yulichang.wrapper.interfaces.SFunctionQuery;
+import com.github.yulichang.wrapper.interfaces.Query;
import com.github.yulichang.wrapper.interfaces.on.OnFunction;
import lombok.Data;
import lombok.Getter;
@@ -33,7 +35,7 @@ import java.util.stream.Collectors;
*/
@SuppressWarnings("all")
public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper>
- implements SFunctionQuery>, LambdaJoin> {
+ implements Query>, LambdaJoin> {
/**
* 查询字段 sql
@@ -116,33 +118,40 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper MPJLambdaWrapper select(SFunction... columns) {
if (ArrayUtils.isNotEmpty(columns)) {
for (SFunction s : columns) {
- selectColumns.add(new SelectColumn(com.github.yulichang.toolkit.LambdaUtils.getEntityClass(s), getCache(s).getColumn(), null));
+ selectColumns.add(SelectColumn.of(LambdaUtils.getEntityClass(s), getCache(s).getColumn()));
}
}
return typedThis;
}
+ @Override
public MPJLambdaWrapper select(Class entityClass, Predicate predicate) {
TableInfo info = TableInfoHelper.getTableInfo(entityClass);
Assert.notNull(info, "table can not be find");
info.getFieldList().stream().filter(predicate).collect(Collectors.toList()).forEach(
- i -> selectColumns.add(new SelectColumn(entityClass, i.getColumn(), null)));
+ i -> selectColumns.add(SelectColumn.of(entityClass, i.getColumn())));
return typedThis;
}
- public final MPJLambdaWrapper selectAs(SFunction columns, SFunction alias) {
- return selectAs(columns, com.github.yulichang.toolkit.LambdaUtils.getName(alias));
+ @Override
+ public MPJLambdaWrapper selectAs(SFunction column, String alias) {
+ selectColumns.add(SelectColumn.of(LambdaUtils.getEntityClass(column), getCache(column).getColumn(), alias));
+ return typedThis;
}
- /**
- * @since 1.1.3
- */
- public final MPJLambdaWrapper selectAs(SFunction columns, String alias) {
- selectColumns.add(new SelectColumn(com.github.yulichang.toolkit.LambdaUtils.getEntityClass(columns), getCache(columns).getColumn(), alias));
+ public MPJLambdaWrapper selectFunc(BaseFuncEnum funcEnum, SFunction column, String alias) {
+ selectColumns.add(SelectColumn.of(LambdaUtils.getEntityClass(column), getCache(column).getColumn(), alias, funcEnum));
+ return typedThis;
+ }
+
+ @Override
+ public MPJLambdaWrapper selectFunc(BaseFuncEnum funcEnum, Object column, String alias) {
+ selectColumns.add(SelectColumn.of(null, column.toString(), alias, funcEnum));
return typedThis;
}
@@ -150,10 +159,10 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper %s", clazz);
if (info.havePK()) {
- selectColumns.add(new SelectColumn(clazz, info.getKeyColumn(), null));
+ selectColumns.add(SelectColumn.of(clazz, info.getKeyColumn()));
}
info.getFieldList().forEach(c ->
- selectColumns.add(new SelectColumn(clazz, c.getColumn(), null)));
+ selectColumns.add(SelectColumn.of(clazz, c.getColumn())));
return typedThis;
}
@@ -172,29 +181,35 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper MPJLambdaWrapper selectIgnore(SFunction... columns) {
if (ArrayUtils.isNotEmpty(columns)) {
for (SFunction s : columns) {
- ignoreColumns.add(new SelectColumn(com.github.yulichang.toolkit.LambdaUtils.getEntityClass(s), getCache(s).getColumn(), null));
+ ignoreColumns.add(SelectColumn.of(LambdaUtils.getEntityClass(s), getCache(s).getColumn()));
}
}
return typedThis;
}
+ /**
+ * 查询条件 SQL 片段
+ */
@Override
public String getSqlSelect() {
if (StringUtils.isBlank(sqlSelect.getStringValue())) {
if (CollectionUtils.isNotEmpty(ignoreColumns)) {
- selectColumns.removeIf(c -> ignoreColumns.stream().anyMatch(i ->
+ selectColumns.removeIf(c -> c.getFuncEnum() == null && ignoreColumns.stream().anyMatch(i ->
i.getClazz() == c.getClazz() && Objects.equals(c.getColumnName(), i.getColumnName())));
}
- String s = selectColumns.stream().map(i ->
- Constant.TABLE_ALIAS + getDefault(subTable.get(i.getClazz())) + StringPool.DOT + i.getColumnName() +
- (StringUtils.isBlank(i.getAlias()) ? StringPool.EMPTY : (Constant.AS + i.getAlias())))
- .collect(Collectors.joining(StringPool.COMMA));
+ String s = selectColumns.stream().map(i -> {
+ String str = Constant.TABLE_ALIAS + getDefault(subTable.get(i.getClazz())) + StringPool.DOT + i.getColumnName();
+ return (i.getFuncEnum() == null ? str : String.format(i.getFuncEnum().getSql(), str)) +
+ (StringUtils.isBlank(i.getAlias()) ? StringPool.EMPTY : (Constant.AS + i.getAlias()));
+ }).collect(Collectors.joining(StringPool.COMMA));
sqlSelect.setStringValue(s);
}
return sqlSelect.getStringValue();
}
-
+ /**
+ * 获取连表部分语句
+ */
public String getFrom() {
if (StringUtils.isBlank(from.getStringValue())) {
StringBuilder value = new StringBuilder();
@@ -264,10 +279,25 @@ public class MPJLambdaWrapper extends MPJAbstractLambdaWrapper clazz, String columnName, String alias) {
+ private BaseFuncEnum funcEnum;
+
+ private SelectColumn(Class> clazz, String columnName, String alias, BaseFuncEnum funcEnum) {
this.clazz = clazz;
this.columnName = columnName;
this.alias = alias;
+ this.funcEnum = funcEnum;
+ }
+
+ public static SelectColumn of(Class> clazz, String columnName) {
+ return of(clazz, columnName, null, null);
+ }
+
+ public static SelectColumn of(Class> clazz, String columnName, String alias) {
+ return of(clazz, columnName, alias, null);
+ }
+
+ public static SelectColumn of(Class> clazz, String columnName, String alias, BaseFuncEnum funcEnum) {
+ return new SelectColumn(clazz, columnName, alias, funcEnum);
}
}
}
diff --git a/src/main/java/com/github/yulichang/wrapper/enums/BaseFuncEnum.java b/src/main/java/com/github/yulichang/wrapper/enums/BaseFuncEnum.java
new file mode 100644
index 0000000..325d9b4
--- /dev/null
+++ b/src/main/java/com/github/yulichang/wrapper/enums/BaseFuncEnum.java
@@ -0,0 +1,11 @@
+package com.github.yulichang.wrapper.enums;
+
+/**
+ * 函数枚举基类
+ *
+ * @author yulichang
+ */
+public interface BaseFuncEnum {
+
+ String getSql();
+}
diff --git a/src/main/java/com/github/yulichang/wrapper/enums/DefaultFuncEnum.java b/src/main/java/com/github/yulichang/wrapper/enums/DefaultFuncEnum.java
new file mode 100644
index 0000000..b0c81ea
--- /dev/null
+++ b/src/main/java/com/github/yulichang/wrapper/enums/DefaultFuncEnum.java
@@ -0,0 +1,32 @@
+package com.github.yulichang.wrapper.enums;
+
+/**
+ * 常用的sql函数枚举 默认实现
+ * 可以自己实现 {@link BaseFuncEnum} 自定义函数
+ * 目前支持一个占位符,不支持多个%s
+ *
+ * 只例举几个通用的,其他函数 first() last() len() ucase() lcase() 等 或者数据库自定义函数请自行扩展
+ *
+ * @author yulichang
+ */
+public enum DefaultFuncEnum implements BaseFuncEnum {
+
+ SUM("SUM(%s)"),
+ COUNT("COUNT(%s)"),
+ MAX("MAX(%s)"),
+ MIN("MIN(%s)"),
+ AVG("AVG(%s)"),
+ LEN("LEN(%s)");
+
+ private final String sql;
+
+ DefaultFuncEnum(String sql) {
+ this.sql = sql;
+ }
+
+ @Override
+ public String getSql() {
+ return this.sql;
+ }
+
+}
diff --git a/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java b/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java
new file mode 100644
index 0000000..3ca76c2
--- /dev/null
+++ b/src/main/java/com/github/yulichang/wrapper/interfaces/Query.java
@@ -0,0 +1,78 @@
+package com.github.yulichang.wrapper.interfaces;
+
+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 java.io.Serializable;
+import java.util.function.Predicate;
+
+/**
+ * 参考 {@link com.baomidou.mybatisplus.core.conditions.query.Query}
+ *
+ * @author yulichang
+ */
+public interface Query extends Serializable {
+
+ /**
+ * 设置查询字段
+ *
+ * @param columns 字段数组
+ * @return children
+ */
+ @SuppressWarnings("unchecked")
+ Children select(SFunction... columns);
+
+ /**
+ * 过滤查询的字段信息(主键除外!)
+ * 例1: 只要 java 字段名以 "test" 开头的 -> select(i -> i.getProperty().startsWith("test"))
+ * 例2: 只要 java 字段属性是 CharSequence 类型的 -> select(TableFieldInfo::isCharSequence)
+ * 例3: 只要 java 字段没有填充策略的 -> select(i -> i.getFieldFill() == FieldFill.DEFAULT)
+ * 例4: 要全部字段 -> select(i -> true)
+ * 例5: 只要主键字段 -> select(i -> false)
+ *
+ * @param predicate 过滤方式
+ * @return children
+ */
+ Children select(Class entityClass, Predicate predicate);
+
+ default Children selectAs(SFunction columns, SFunction alias) {
+ return selectAs(columns, LambdaUtils.getName(alias));
+ }
+
+ /**
+ * 别名查询
+ */
+ Children selectAs(SFunction column, String alias);
+
+
+ default Children selectFunc(BaseFuncEnum funcEnum, SFunction column) {
+ return selectFunc(funcEnum, column, column);
+ }
+
+
+ default Children selectFunc(BaseFuncEnum funcEnum, SFunction column, SFunction alias) {
+ return selectFunc(funcEnum, column, LambdaUtils.getName(alias));
+ }
+
+ /**
+ * 聚合函数查询
+ *
+ * @param funcEnum 函数枚举 {@link com.github.yulichang.wrapper.enums.DefaultFuncEnum}
+ * @param column 函数作用的字段
+ * @param alias 别名
+ */
+ Children selectFunc(BaseFuncEnum funcEnum, SFunction column, String alias);
+
+ default Children selectFunc(BaseFuncEnum funcEnum, Object column, SFunction alias) {
+ return selectFunc(funcEnum, column, LambdaUtils.getName(alias));
+ }
+
+ Children selectFunc(BaseFuncEnum funcEnum, Object column, String alias);
+
+ /**
+ * select sql 片段
+ */
+ String getSqlSelect();
+}
diff --git a/src/main/java/com/github/yulichang/wrapper/interfaces/SFunctionQuery.java b/src/main/java/com/github/yulichang/wrapper/interfaces/SFunctionQuery.java
deleted file mode 100644
index dd0c131..0000000
--- a/src/main/java/com/github/yulichang/wrapper/interfaces/SFunctionQuery.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.github.yulichang.wrapper.interfaces;
-
-import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
-import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
-
-import java.io.Serializable;
-import java.util.function.Predicate;
-
-/**
- * copy {@link com.baomidou.mybatisplus.core.conditions.query.Query}
- */
-public interface SFunctionQuery extends Serializable {
-
- /**
- * 设置查询字段
- *
- * @param columns 字段数组
- * @return children
- */
- @SuppressWarnings("unchecked")
- Children select(SFunction... columns);
-
- /**
- * ignore
- * 注意只有内部有 entity 才能使用该方法
- */
- default Children select(Predicate predicate) {
- return select(null, predicate);
- }
-
- /**
- * 过滤查询的字段信息(主键除外!)
- * 例1: 只要 java 字段名以 "test" 开头的 -> select(i -> i.getProperty().startsWith("test"))
- * 例2: 只要 java 字段属性是 CharSequence 类型的 -> select(TableFieldInfo::isCharSequence)
- * 例3: 只要 java 字段没有填充策略的 -> select(i -> i.getFieldFill() == FieldFill.DEFAULT)
- * 例4: 要全部字段 -> select(i -> true)
- * 例5: 只要主键字段 -> select(i -> false)
- *
- * @param predicate 过滤方式
- * @return children
- */
- Children select(Class entityClass, Predicate predicate);
-
- /**
- * 查询条件 SQL 片段
- */
- String getSqlSelect();
-}