All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.gitee.mingbaobaba.apijson.querycondition.query.conditions.AbstractQueryWrapper Maven / Gradle / Ivy

There is a newer version: v1.1.0
Show newest version
package io.gitee.mingbaobaba.apijson.querycondition.query.conditions;

import org.apache.commons.lang3.StringUtils;

import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Collectors;

/**
 * 

构建参数查询基类

* * @author yingsheng.ye * @version 1.0.0 * @since 2023/6/23 8:27 */ @SuppressWarnings("unchecked") public abstract class AbstractQueryWrapper> extends AbstractBaseWrapper { /** * 子类实现查询列 * * @param columns 查询列 * @return C */ protected abstract C select(R... columns); /** * 子类实现查询列 * * @param condition 条件false忽略 * @param columns 查询列 * @return C */ protected abstract C select(boolean condition, R... columns); /** * 添加条件,子类实现 * * @param condition 条件false忽略 * @param column 列 * @param keyword 连接条件 * @param val 值 * @return Children */ protected abstract C addCondition(boolean condition, R column, EnumKeyword keyword, Object val); /** * 添加聚合函数,子类实现 * * @param condition 条件false忽略 * @param column 列 * @param keyword 连接条件 * @param val 值 * @return Children */ protected abstract C addAggFunc(boolean condition, R column, EnumKeyword keyword, Object val); /** * 添加分组函数,子类实现 * * @param condition 条件false忽略 * @param column 列 * @param keyword 连接条件 * @return Children */ protected abstract C addGroupFunc(boolean condition, R column, EnumKeyword keyword); /** * 添加排序函数,子类实现 * * @param condition 条件 * @param column 列 * @param keyword 关键字 * @param s 排序值 +升序 -降序 * @return C */ protected abstract C addOrderByFunc(boolean condition, R column, EnumKeyword keyword, String s); /** * 子类返回一个自己的新对象 */ protected abstract C instance(); /** * 多重嵌套条件处理 * * @param condition 条件 * @param keyword 关键字 * @param consumer Consumer */ private void addNestedCondition(boolean condition, EnumKeyword keyword, Consumer consumer) { if (condition) { final C instance = instance(); consumer.accept(instance); //获取条件 List cList = instance.conditionList.stream().filter(item -> !item.getKeyword().equals(EnumKeyword.AND) && !item.getKeyword().equals(EnumKeyword.OR) && !item.getKeyword().equals(EnumKeyword.NOT)).collect(Collectors.toList()); //条件转换 cList.forEach(cd -> { //判断字段是否存在 if (this.conditionList.stream().noneMatch(item -> StringUtils.isNotBlank(item.getColumn()) && item.getColumn().equals(cd.getColumn()))) { this.conditionList.add(new Condition(null, keyword, null)); this.conditionList.add(cd); } }); } } /** * 且 * * @param condition 条件 * @return C */ public C and(boolean condition) { return addCondition(condition, null, EnumKeyword.AND, null); } /** * 且 * * @return C */ public C and() { return addCondition(true, null, EnumKeyword.AND, null); } /** * 且 * * @param condition 条件 * @param consumer 新对象 * @return C */ public C and(boolean condition, Consumer consumer) { addNestedCondition(condition, EnumKeyword.AND, consumer); return typedThis; } /** * 且 * * @param consumer 新对象 * @return C */ public C and(Consumer consumer) { return and(true, consumer); } /** * 或 * * @param condition 条件 * @return C */ public C or(boolean condition) { return addCondition(condition, null, EnumKeyword.OR, null); } /** * 或 * * @return C */ public C or() { return addCondition(true, null, EnumKeyword.OR, null); } /** * 或 * * @param condition 条件 * @param consumer 新对象 * @return C */ public C or(boolean condition, Consumer consumer) { addNestedCondition(condition, EnumKeyword.OR, consumer); return typedThis; } /** * 或 * * @param consumer 新对象 * @return C */ public C or(Consumer consumer) { return or(true, consumer); } /** * 非 * * @return C */ public C not() { return addCondition(true, null, EnumKeyword.NOT, null); } /** * 非 * * @return C */ public C not(boolean condition) { return addCondition(condition, null, EnumKeyword.NOT, null); } /** * 非 * * @return C */ public C not(boolean condition, Consumer consumer) { addNestedCondition(condition, EnumKeyword.NOT, consumer); return typedThis; } /** * 非 * * @return C */ public C not(Consumer consumer) { return not(true, consumer); } /** * 列为空 * * @param column 列 * @return C */ public C isNull(R column) { return isNull(true, column); } /** * 列为空 * * @param condition 条件 * @param column 列 * @return C */ public C isNull(boolean condition, R column) { return addCondition(condition, column, EnumKeyword.NULL, "=null"); } /** * 列不为空 * * @param column 列 * @return C */ public C isNotNull(R column) { return isNotNull(true, column); } /** * 列不为空 * * @param column 列 * @return C */ public C isNotNull(boolean condition, R column) { return addCondition(condition, column, EnumKeyword.NOT_NULL, "!=null"); } /** * in * * @param condition 条件 * @param column 列 * @param val 值 * @return C */ public C in(boolean condition, R column, Object val) { return addCondition(condition, column, EnumKeyword.IN, val); } /** * in * * @param column 列 * @param val 值 * @return C */ public C in(R column, Object val) { return addCondition(true, column, EnumKeyword.IN, val); } /** * not in * * @param condition 条件 * @param column 列 * @param val 值 * @return C */ public C notIn(boolean condition, R column, Object val) { return addCondition(condition, column, EnumKeyword.NOT_IN, val); } /** * not in * * @param column 列 * @param val 值 * @return C */ public C notIn(R column, Object val) { return addCondition(true, column, EnumKeyword.NOT_IN, val); } /** * 模糊匹配 * * @param condition 条件 * @param column 列 * @param val 值 * @return C */ public C like(boolean condition, R column, Object val) { return addCondition(condition, column, EnumKeyword.LIKE, "%" + val + "%"); } /** * 模糊匹配 * * @param column 列 * @param val 值 * @return C */ public C like(R column, Object val) { return addCondition(true, column, EnumKeyword.LIKE, "%" + val + "%"); } /** * 左模糊匹配 * * @param condition 条件 * @param column 列 * @param val 值 * @return C */ public C leftLike(boolean condition, R column, Object val) { return addCondition(condition, column, EnumKeyword.LIKE, "%" + val); } /** * 左模糊匹配 * * @param column 列 * @param val 值 * @return C */ public C leftLike(R column, Object val) { return addCondition(true, column, EnumKeyword.LIKE, "%" + val); } /** * 右模糊匹配 * * @param condition 条件 * @param column 列 * @param val 值 * @return C */ public C rightLike(boolean condition, R column, Object val) { return addCondition(condition, column, EnumKeyword.LIKE, val + "%"); } /** * 右模糊匹配 * * @param column 列 * @param val 值 * @return C */ public C rightLike(R column, Object val) { return addCondition(true, column, EnumKeyword.LIKE, val + "%"); } /** * 过滤模糊匹配 * * @param condition 条件 * @param column 列 * @param val 值 * @return C */ public C notLike(boolean condition, R column, Object val) { return addCondition(condition, column, EnumKeyword.NOT_LIKE, "%" + val + "%"); } /** * 过滤模糊匹配 * * @param column 列 * @param val 值 * @return C */ public C notLike(R column, Object val) { return addCondition(true, column, EnumKeyword.NOT_LIKE, "%" + val + "%"); } /** * 等于 * * @param condition 条件 * @param column 列 * @param val 值 * @return C */ public C eq(boolean condition, R column, Object val) { return addCondition(condition, column, EnumKeyword.EQ, val); } /** * 等于 * * @param column 列 * @param val 值 * @return C */ public C eq(R column, Object val) { return addCondition(true, column, EnumKeyword.EQ, val); } /** * 不等于 * * @param condition 条件 * @param column 列 * @param val 值 * @return C */ public C ne(boolean condition, R column, Object val) { return addCondition(condition, column, EnumKeyword.NE, val); } /** * 不等于 * * @param column 列 * @param val 值 * @return C */ public C ne(R column, Object val) { return addCondition(true, column, EnumKeyword.NE, val); } /** * 大于等于 * * @param condition 条件 * @param column 列 * @param val 值 * @return C */ public C ge(boolean condition, R column, Object val) { return addCondition(condition, column, EnumKeyword.GE, val); } /** * 大于等于 * * @param column 列 * @param val 值 * @return C */ public C ge(R column, Object val) { return addCondition(true, column, EnumKeyword.GE, val); } /** * 大于 * * @param condition 条件 * @param column 列 * @param val 值 * @return C */ public C gt(boolean condition, R column, Object val) { return addCondition(condition, column, EnumKeyword.GT, val); } /** * 大于 * * @param column 列 * @param val 值 * @return C */ public C gt(R column, Object val) { return addCondition(true, column, EnumKeyword.GT, val); } /** * 小于等于 * * @param condition 条件 * @param column 列 * @param val 值 * @return C */ public C le(boolean condition, R column, Object val) { return addCondition(condition, column, EnumKeyword.LE, val); } /** * 小于等于 * * @param column 列 * @param val 值 * @return C */ public C le(R column, Object val) { return addCondition(true, column, EnumKeyword.LE, val); } /** * 小于 * * @param condition 条件 * @param column 列 * @param val 值 * @return C */ public C lt(boolean condition, R column, Object val) { return addCondition(condition, column, EnumKeyword.LT, val); } /** * 小于 * * @param column 列 * @param val 值 * @return C */ public C lt(R column, Object val) { return addCondition(true, column, EnumKeyword.LT, val); } /** * 正则表达式匹配 * * @param column 列 * @param exp 表达式 * @return C */ public C regExp(boolean condition, R column, String exp) { return addCondition(condition, column, EnumKeyword.REG_EXP, exp); } /** * 正则表达式匹配 * * @param column 列 * @param exp 表达式 * @return C */ public C regExp(R column, String exp) { return addCondition(true, column, EnumKeyword.REG_EXP, exp); } /** * 范围内匹配 * * @param condition 条件 * @param column 列 * @param start 起始值 * @param end 结束值 * @return C */ public C between(boolean condition, R column, Object start, Object end) { return addCondition(condition, column, EnumKeyword.BETWEEN_AND, start + "," + end); } /** * 范围内匹配 * * @param column 列 * @param start 起始值 * @param end 结束值 * @return C */ public C between(R column, Object start, Object end) { return addCondition(true, column, EnumKeyword.BETWEEN_AND, start + "," + end); } /** * 升序排序 * * @param condition 条件 * @param column 列 * @return C */ public C orderByAsc(boolean condition, R column) { return orderBy(condition, column, true); } /** * 升序排序 * * @param column 列 * @return C */ public C orderByAsc(R column) { return orderBy(column, true); } /** * 降序排序 * * @param condition 条件 * @param column 列 * @return C */ public C orderByDesc(boolean condition, R column) { return orderBy(condition, column, false); } /** * 降序排序 * * @param column 列 * @return C */ public C orderByDesc(R column) { return orderBy(column, false); } /** * 排序 * * @param condition 条件 * @param column 列 * @param isAsc 是否升序 * @return C */ public C orderBy(boolean condition, R column, boolean isAsc) { return addOrderByFunc(condition, column, EnumKeyword.ORDER_BY, isAsc ? EnumOrder.ASC.getCode() : EnumOrder.DESC.getCode()); } /** * 排序 * * @param column 列 * @param isAsc 是否升序 * @return C */ public C orderBy(R column, boolean isAsc) { return orderBy(true, column, isAsc); } /** * 统计 * * @param column 列 * @param alias 别名 * @return C */ public C count(R column, String alias) { return addAggFunc(true, column, EnumKeyword.COUNT, alias); } /** * 统计 * * @param condition 条件 * @param column 列 * @param alias 别名 * @return C */ public C count(boolean condition, R column, String alias) { return addAggFunc(condition, column, EnumKeyword.COUNT, alias); } /** * 汇总 * * @param column 列 * @param alias 别名 * @return C */ public C sum(R column, String alias) { return addAggFunc(true, column, EnumKeyword.SUM, alias); } /** * 汇总 * * @param condition 条件 * @param column 列 * @param alias 别名 * @return C */ public C sum(boolean condition, R column, String alias) { return addAggFunc(condition, column, EnumKeyword.SUM, alias); } /** * 最大值 * * @param column 列 * @param alias 别名 * @return C */ public C max(R column, String alias) { return addAggFunc(true, column, EnumKeyword.MAX, alias); } /** * 最大值 * * @param condition 条件 * @param column 列 * @param alias 别名 * @return C */ public C max(boolean condition, R column, String alias) { return addAggFunc(condition, column, EnumKeyword.MAX, alias); } /** * 最小值 * * @param column 列 * @param alias 别名 * @return C */ public C min(R column, String alias) { return addAggFunc(true, column, EnumKeyword.MIN, alias); } /** * 最小值 * * @param condition 条件 * @param column 列 * @param alias 别名 * @return C */ public C min(boolean condition, R column, String alias) { return addAggFunc(condition, column, EnumKeyword.MIN, alias); } /** * 平均值 * * @param column 列 * @param alias 别名 * @return C */ public C avg(R column, String alias) { return addAggFunc(true, column, EnumKeyword.AVG, alias); } /** * 平均值 * * @param condition 条件 * @param column 列 * @param alias 别名 * @return C */ public C avg(boolean condition, R column, String alias) { return addAggFunc(condition, column, EnumKeyword.AVG, alias); } /** * 分组 * * @param condition 条件 * @param column 列 * @return C */ public C group(boolean condition, R column) { return addGroupFunc(condition, column, EnumKeyword.GROUP); } /** * having * * @param func SQL函数条件,一般和@group一起用,函数一般在@column里声明 *

* 示例: * 查询 按userId分组、id最大值>=100 的Moment数组: * "@column":"userId;max(id)", * "@group":"userId", * "@having":"max(id)>=100"(opens new window) * 对应SQL是SELECT userId,max(id) ... GROUP BY userId HAVING max(id)>=100 * 还可以指定函数返回名: * "@column":"userId;max(id):maxId", * "@group":"userId", * "@having":"maxId>=100"(opens new window) * 对应SQL是SELECT userId,max(id) AS maxId ... GROUP BY userId HAVING maxId>=100 *

* @return C */ protected C having(String func) { this.havingFunc = func; return typedThis; } /** * 拼接参数 * * @param condition 条件 * @param key key值 * @param value value值 * @return C */ public C apply(boolean condition, EnumApiJson key, String value) { if (condition) { this.lastAppendMap.put(key.getCode(), value); } return typedThis; } /** * 拼接参数 * * @param key key值 * @param value value值 * @return C */ public C apply(EnumApiJson key, String value) { return apply(true, key, value); } /** * 分组 * * @param column 列 * @return C */ public C group(R column) { return addGroupFunc(true, column, EnumKeyword.GROUP); } /** * 聚合函数处理 * * @param dwKeyword 关键字 * @param column 列名 * @param alias 别名 */ protected void aggFuncHandle(EnumKeyword dwKeyword, String column, Object alias) { switch (dwKeyword) { case COUNT: this.columnList.add("count(" + column + "):" + alias); break; case SUM: this.columnList.add("sum(" + column + "):" + alias); break; case MAX: this.columnList.add("max(" + column + "):" + alias); break; case MIN: this.columnList.add("min(" + column + "):" + alias); break; case AVG: this.columnList.add("avg(" + column + "):" + alias); break; default: } } /** * 分组函数处理 * * @param keyword 关键字 * @param column 列名 */ protected void groupFuncHandle(EnumKeyword keyword, String column) { if (keyword.equals(EnumKeyword.GROUP)) { this.groupList.add(column); } } /** * 条件处理 * * @param condition 条件 */ protected void conditionHandle(Condition condition) { this.conditionList.add(condition); } /** * 排序处理 * * @param keyword 关键字 * @param column 排序列 */ protected void orderByFuncHandle(EnumKeyword keyword, String column) { if (keyword.equals(EnumKeyword.ORDER_BY)) { this.orderByList.add(column); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy