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(); -}