package com.fjhx.utils.wrapperUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.AbstractWrapper; 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.TableInfoHelper; import com.baomidou.mybatisplus.core.toolkit.ArrayUtils; import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import lombok.SneakyThrows; import org.apache.ibatis.reflection.property.PropertyNamer; import org.springblade.core.log.exception.ServiceException; import java.lang.invoke.SerializedLambda; import java.lang.reflect.Method; import java.util.Collection; import java.util.Date; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Predicate; @SuppressWarnings({"unused"}) public class IWrapper extends AbstractWrapper> implements Query, T, String> { // ===================================================================== // QueryWrapper原生方法 // ===================================================================== private final SharedString sqlSelect = new SharedString(); private IWrapper(T entityMap, Class entityClass, AtomicInteger paramNameSeq, Map paramNameValuePairs, MergeSegments mergeSegments, SharedString lastSql, SharedString sqlComment, SharedString sqlFirst) { super.setEntity(entityMap); super.setEntityClass(entityClass); this.paramNameSeq = paramNameSeq; this.paramNameValuePairs = paramNameValuePairs; this.expression = mergeSegments; this.lastSql = lastSql; this.sqlComment = sqlComment; this.sqlFirst = sqlFirst; } @Override public IWrapper select(String... columns) { if (ArrayUtils.isNotEmpty(columns)) { this.sqlSelect.setStringValue(String.join(StringPool.COMMA, columns)); } return this; } @Override public IWrapper select(Class entityClass, Predicate predicate) { super.setEntityClass(entityClass); this.sqlSelect.setStringValue(TableInfoHelper.getTableInfo(getEntityClass()).chooseSelect(predicate)); return this; } @Override public String getSqlSelect() { return sqlSelect.getStringValue(); } @Override protected IWrapper instance() { return new IWrapper<>(getEntity(), getEntityClass(), paramNameSeq, paramNameValuePairs, new MergeSegments(), SharedString.emptyString(), SharedString.emptyString(), SharedString.emptyString()); } @Override public void clear() { super.clear(); sqlSelect.toNull(); } // ===================================================================== // 初始化 // ===================================================================== private Map entityMap; private IWrapper() { super.initNeed(); } private IWrapper(Object obj) { super.initNeed(); entityMap = BeanUtil.beanToMap(obj); } private IWrapper(Map map) { super.initNeed(); entityMap = map; } public static IWrapper getWrapper() { return new IWrapper<>(); } public static IWrapper getWrapper(Object obj) { return new IWrapper<>(obj); } public static IWrapper getWrapper(Map map) { return new IWrapper<>(map); } // ===================================================================== // 拓展方法 // ===================================================================== /** * 时间段查询 */ public IWrapper periodTime(SFunction function) { return periodTime(getSqlFieldName(function)); } public IWrapper periodTime(String alias, SFunction function) { return periodTime(getSqlFieldName(alias, function)); } public IWrapper periodTime(String field) { Object beginTime = getValue("beginTime"); if (ObjectUtil.isNull(beginTime)) { return this; } Object endTime = getValue("endTime"); if (ObjectUtil.isNull(endTime)) { return this; } Date beginOfDay; Date endOfDay; try { beginOfDay = DateUtil.beginOfDay(DateUtil.parse(beginTime.toString())); endOfDay = DateUtil.endOfDay(DateUtil.parse(endTime.toString())); } catch (Exception e) { throw new ServiceException("时间类型转换错误"); } return between(true, field, beginOfDay, endOfDay); } /** * 关键字查询 */ public IWrapper keyword(KeywordData... keywordData) { Object value = getValue("keyword"); return keyword(value, keywordData); } public IWrapper keyword(Object value, KeywordData... keywordData) { this.and(ObjectUtil.isNotEmpty(value), q -> { for (KeywordData keywordDatum : keywordData) { q.or().like(keywordDatum.getSqlFieldName(), value); } }); return this; } /** * 查询字段 */ @SafeVarargs public final IWrapper select(SFunction... functions) { return select(getColumns(functions)); } /** * 排序 */ public IWrapper orderByAsc(SFunction function) { return orderByAsc(getSqlFieldName(function)); } public IWrapper orderByAsc(String alias, SFunction function) { return orderByAsc(getSqlFieldName(alias, function)); } public IWrapper orderByDesc(SFunction function) { return orderByDesc(getSqlFieldName(function)); } public IWrapper orderByDesc(String alias, SFunction function) { return orderByDesc(getSqlFieldName(alias, function)); } /** * between */ public IWrapper between(SFunction function, Object val1, Object val2) { String sqlFieldName = getSqlFieldName(function); return between(sqlFieldName, val1, val2); } public IWrapper between(String alias, SFunction function, Object val1, Object val2) { String sqlFieldName = getSqlFieldName(alias, function); return between(sqlFieldName, val1, val2); } public IWrapper between(String sqlFieldName, Object val1, Object val2) { return between(ObjectUtil.isAllNotEmpty(val1, val2), sqlFieldName, val1, val2); } /** * eq */ public IWrapper eq(SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(fieldName); Object value = getValue(fieldName); return eq(sqlFieldName, value); } public IWrapper eq(SFunction function, Object value) { String sqlFieldName = getSqlFieldName(function); return eq(sqlFieldName, value); } public IWrapper eq(String alias, SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(alias, fieldName); Object value = getValue(fieldName); return eq(sqlFieldName, value); } public IWrapper eq(String alias, SFunction function, Object value) { String sqlFieldName = getSqlFieldName(alias, function); return eq(sqlFieldName, value); } @Override public IWrapper eq(String sqlFieldName, Object value) { return eq(ObjectUtil.isNotEmpty(value), sqlFieldName, value); } /** * ne */ public IWrapper ne(SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(fieldName); Object value = getValue(fieldName); return ne(sqlFieldName, value); } public IWrapper ne(SFunction function, Object value) { String sqlFieldName = getSqlFieldName(function); return ne(sqlFieldName, value); } public IWrapper ne(String alias, SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(alias, fieldName); Object value = getValue(fieldName); return ne(sqlFieldName, value); } public IWrapper ne(String alias, SFunction function, Object value) { String sqlFieldName = getSqlFieldName(alias, function); return ne(sqlFieldName, value); } @Override public IWrapper ne(String sqlFieldName, Object value) { return ne(ObjectUtil.isNotEmpty(value), sqlFieldName, value); } /** * ge */ public IWrapper ge(SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(fieldName); Object value = getValue(fieldName); return ge(sqlFieldName, value); } public IWrapper ge(SFunction function, Object value) { String sqlFieldName = getSqlFieldName(function); return ge(sqlFieldName, value); } public IWrapper ge(String alias, SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(alias, fieldName); Object value = getValue(fieldName); return ge(sqlFieldName, value); } public IWrapper ge(String alias, SFunction function, Object value) { String sqlFieldName = getSqlFieldName(alias, function); return ge(sqlFieldName, value); } @Override public IWrapper ge(String sqlFieldName, Object value) { return ge(ObjectUtil.isNotEmpty(value), sqlFieldName, value); } /** * gt */ public IWrapper gt(SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(fieldName); Object value = getValue(fieldName); return gt(sqlFieldName, value); } public IWrapper gt(SFunction function, Object value) { String sqlFieldName = getSqlFieldName(function); return gt(sqlFieldName, value); } public IWrapper gt(String alias, SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(alias, fieldName); Object value = getValue(fieldName); return gt(sqlFieldName, value); } public IWrapper gt(String alias, SFunction function, Object value) { String sqlFieldName = getSqlFieldName(alias, function); return gt(sqlFieldName, value); } @Override public IWrapper gt(String sqlFieldName, Object value) { return gt(ObjectUtil.isNotEmpty(value), sqlFieldName, value); } /** * le */ public IWrapper le(SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(fieldName); Object value = getValue(fieldName); return le(sqlFieldName, value); } public IWrapper le(SFunction function, Object value) { String sqlFieldName = getSqlFieldName(function); return le(sqlFieldName, value); } public IWrapper le(String alias, SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(alias, fieldName); Object value = getValue(fieldName); return le(sqlFieldName, value); } public IWrapper le(String alias, SFunction function, Object value) { String sqlFieldName = getSqlFieldName(alias, function); return le(sqlFieldName, value); } @Override public IWrapper le(String sqlFieldName, Object value) { return le(ObjectUtil.isNotEmpty(value), sqlFieldName, value); } /** * lt */ public IWrapper lt(SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(fieldName); Object value = getValue(fieldName); return lt(sqlFieldName, value); } public IWrapper lt(SFunction function, Object value) { String sqlFieldName = getSqlFieldName(function); return lt(sqlFieldName, value); } public IWrapper lt(String alias, SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(alias, fieldName); Object value = getValue(fieldName); return lt(sqlFieldName, value); } public IWrapper lt(String alias, SFunction function, Object value) { String sqlFieldName = getSqlFieldName(alias, function); return lt(sqlFieldName, value); } @Override public IWrapper lt(String sqlFieldName, Object value) { return lt(ObjectUtil.isNotEmpty(value), sqlFieldName, value); } /** * like */ public IWrapper like(SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(fieldName); Object value = getValue(fieldName); return like(sqlFieldName, value); } public IWrapper like(SFunction function, Object value) { String sqlFieldName = getSqlFieldName(function); return like(sqlFieldName, value); } public IWrapper like(String alias, SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(alias, fieldName); Object value = getValue(fieldName); return like(sqlFieldName, value); } public IWrapper like(String alias, SFunction function, Object value) { String sqlFieldName = getSqlFieldName(alias, function); return like(sqlFieldName, value); } @Override public IWrapper like(String sqlFieldName, Object value) { return like(ObjectUtil.isNotEmpty(value), sqlFieldName, value); } /** * notLike */ public IWrapper notLike(SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(fieldName); Object value = getValue(fieldName); return notLike(sqlFieldName, value); } public IWrapper notLike(SFunction function, Object value) { String sqlFieldName = getSqlFieldName(function); return notLike(sqlFieldName, value); } public IWrapper notLike(String alias, SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(alias, fieldName); Object value = getValue(fieldName); return notLike(sqlFieldName, value); } public IWrapper notLike(String alias, SFunction function, Object value) { String sqlFieldName = getSqlFieldName(alias, function); return notLike(sqlFieldName, value); } @Override public IWrapper notLike(String sqlFieldName, Object value) { return notLike(ObjectUtil.isNotEmpty(value), sqlFieldName, value); } /** * likeLeft */ public IWrapper likeLeft(SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(fieldName); Object value = getValue(fieldName); return likeLeft(sqlFieldName, value); } public IWrapper likeLeft(SFunction function, Object value) { String sqlFieldName = getSqlFieldName(function); return likeLeft(sqlFieldName, value); } public IWrapper likeLeft(String alias, SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(alias, fieldName); Object value = getValue(fieldName); return likeLeft(sqlFieldName, value); } public IWrapper likeLeft(String alias, SFunction function, Object value) { String sqlFieldName = getSqlFieldName(alias, function); return likeLeft(sqlFieldName, value); } @Override public IWrapper likeLeft(String sqlFieldName, Object value) { return likeLeft(ObjectUtil.isNotEmpty(value), sqlFieldName, value); } /** * likeRight */ public IWrapper likeRight(SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(fieldName); Object value = getValue(fieldName); return likeRight(sqlFieldName, value); } public IWrapper likeRight(SFunction function, Object value) { String sqlFieldName = getSqlFieldName(function); return likeRight(sqlFieldName, value); } public IWrapper likeRight(String alias, SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(alias, fieldName); Object value = getValue(fieldName); return likeRight(sqlFieldName, value); } public IWrapper likeRight(String alias, SFunction function, Object value) { String sqlFieldName = getSqlFieldName(alias, function); return likeRight(sqlFieldName, value); } @Override public IWrapper likeRight(String sqlFieldName, Object value) { return likeRight(ObjectUtil.isNotEmpty(value), sqlFieldName, value); } /** * in */ public IWrapper in(SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(fieldName); Object value = getValue(fieldName); return in(sqlFieldName, (Collection) value); } public IWrapper in(String alias, SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(alias, fieldName); Object value = getValue(fieldName); return in(sqlFieldName, (Collection) value); } public IWrapper in(SFunction function, Collection value) { String sqlFieldName = getSqlFieldName(function); return in(sqlFieldName, value); } public IWrapper in(String alias, SFunction function, Collection value) { String sqlFieldName = getSqlFieldName(alias, function); return in(sqlFieldName, value); } public IWrapper in(SFunction function, Object... value) { String sqlFieldName = getSqlFieldName(function); return in(sqlFieldName, value); } public IWrapper in(String alias, SFunction function, Object... value) { String sqlFieldName = getSqlFieldName(alias, function); return in(sqlFieldName, value); } @Override public IWrapper in(String sqlFieldName, Collection value) { return in(ObjectUtil.isNotEmpty(value), sqlFieldName, value); } @Override public IWrapper in(String sqlFieldName, Object... value) { if (value.length == 0) { return this; } if (value[0] instanceof Collection) { return in(ObjectUtil.isNotEmpty(value[0]), sqlFieldName, Convert.toList(value[0])); } return in(sqlFieldName, Convert.toList(value)); } /** * notIn */ public IWrapper notIn(SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(fieldName); Object value = getValue(fieldName); return notIn(sqlFieldName, (Collection) value); } public IWrapper notIn(String alias, SFunction function) { String fieldName = getFieldName(function); String sqlFieldName = getSqlFieldName(alias, fieldName); Object value = getValue(fieldName); return notIn(sqlFieldName, (Collection) value); } public IWrapper notIn(SFunction function, Collection value) { String sqlFieldName = getSqlFieldName(function); return notIn(sqlFieldName, value); } public IWrapper notIn(String alias, SFunction function, Collection value) { String sqlFieldName = getSqlFieldName(alias, function); return notIn(sqlFieldName, value); } public IWrapper notIn(SFunction function, Object... value) { String sqlFieldName = getSqlFieldName(function); return notIn(sqlFieldName, value); } public IWrapper notIn(String alias, SFunction function, Object... value) { String sqlFieldName = getSqlFieldName(alias, function); return notIn(sqlFieldName, value); } @Override public IWrapper notIn(String sqlFieldName, Collection value) { return notIn(ObjectUtil.isNotEmpty(value), sqlFieldName, value); } @Override public IWrapper notIn(String sqlFieldName, Object... value) { if (value.length == 0) { return this; } if (value[0] instanceof Collection) { return notIn(ObjectUtil.isNotEmpty(value[0]), sqlFieldName, Convert.toList(value[0])); } return notIn(sqlFieldName, Convert.toList(value)); } // ===================================================================== // 私有方法 // ===================================================================== /** * 获取对象字段名 * 例:getFieldName(Entity::getBaseId) -》 return "baseId" */ @SneakyThrows private String getFieldName(SFunction function) { // SerializedLambda resolve = SerializedLambda.resolve(function); // return PropertyNamer.methodToProperty(resolve.getImplMethodName()); Method method = function.getClass().getDeclaredMethod("writeReplace"); method.setAccessible(true); SerializedLambda serializedLambda = (SerializedLambda) method.invoke(function); return PropertyNamer.methodToProperty(serializedLambda.getImplMethodName()); } /** * 获取sql字段名 * 例:getSqlFieldName(Entity::getBaseId) -》 return "base_id" */ private String getSqlFieldName(SFunction function) { return StrUtil.toUnderlineCase(getFieldName(function)); } /** * 获取sql字段名 * 例:getSqlFieldName("s", Entity::getBaseId) -》 return "s.base_id" */ private String getSqlFieldName(String alias, SFunction function) { return StrUtil.toUnderlineCase(alias + "." + getFieldName(function)); } /** * 获取sql字段名 * 例:getSqlFieldName("baseId") -》 return "base_id" */ private String getSqlFieldName(String fieldName) { return StrUtil.toUnderlineCase(fieldName); } /** * 获取sql字段名 * 例:getSqlFieldName("s", "baseId") -》 return "s.base_id" */ private String getSqlFieldName(String alias, String fieldName) { return alias + "." + StrUtil.toUnderlineCase(fieldName); } /** * 获取字段值 */ private Object getValue(String fieldName) { if (entityMap == null) { throw new NullPointerException("需要传入提供字段值的对象"); } return entityMap.get(fieldName); } /** * functions转String[] */ @SafeVarargs private final String[] getColumns(SFunction... functions) { String[] columns = new String[functions.length]; for (int i = 0; i < functions.length; i++) { columns[i] = getSqlFieldName(functions[i]); } return columns; } }