组装Mybatis Plus 查询条件添加排除条件

This commit is contained in:
Administrator 2023-04-12 18:46:39 +08:00
parent 3d6b57632f
commit 683a36eeda

View File

@ -26,20 +26,29 @@ public class QueryGenerator {
private static final String STAR = "*";
private static final String COMMA = ",";
private static final String NOT_EQUAL = "!";
/**高级查询前端传来的参数名*/
/**
* 高级查询前端传来的参数名
*/
private static final String SUPER_QUERY_PARAMS = "superQueryParams";
/**排序列*/
/**
* 排序列
*/
private static final String ORDER_COLUMN = "column";
/**排序方式*/
/**
* 排序方式
*/
private static final String ORDER_TYPE = "order";
private static final String ORDER_TYPE_ASC = "ASC";
/**时间格式化 */
/**
* 时间格式化
*/
private static final ThreadLocal<SimpleDateFormat> local = new ThreadLocal<SimpleDateFormat>();
private static SimpleDateFormat getTime(){
private static SimpleDateFormat getTime() {
SimpleDateFormat time = local.get();
if(time == null){
if (time == null) {
time = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
local.set(time);
}
@ -48,18 +57,97 @@ public class QueryGenerator {
/**
* 获取查询条件构造器QueryWrapper实例 通用查询条件已被封装完成
*
* @param searchObj 查询实体
* @param parameterMap request.getParameterMap()
* @return QueryWrapper实例
*/
public static <T> QueryWrapper<T> initQueryWrapper(T searchObj, Map<String, String[]> parameterMap){
public static <T> QueryWrapper<T> initQueryWrapper(T searchObj, Map<String, String[]> parameterMap) {
long start = System.currentTimeMillis();
QueryWrapper<T> queryWrapper = new QueryWrapper<T>();
installMplus(queryWrapper, searchObj, parameterMap);
log.info("---查询条件构造器初始化完成,耗时:"+(System.currentTimeMillis()-start)+"毫秒----");
log.info("---查询条件构造器初始化完成,耗时:" + (System.currentTimeMillis() - start) + "毫秒----");
return queryWrapper;
}
/**
* 组装Mybatis Plus 查询条件
*
* @param queryWrapper
* @param searchObj
* @param parameterMap
* @param excludeFields 排除属性
*/
public static void installMplus(QueryWrapper<?> queryWrapper, Object searchObj, Map<String, String[]> parameterMap, List<String> excludeFields) {
/*
* 注意:权限查询由前端配置数据规则 当一个人有多个所属部门时候 可以在规则配置包含条件 orgCode 包含 #{sys_org_code}
但是不支持在自定义SQL中写orgCode in #{sys_org_code}
当一个人只有一个部门 就直接配置等于条件: orgCode 等于 #{sys_org_code} 或者配置自定义SQL: orgCode = '#{sys_org_code}'
*/
//区间条件组装 模糊查询 高级查询组装 简单排序 权限查询
PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(searchObj);
String name, type;
for (int i = 0; i < origDescriptors.length; i++) {
//aliasName = origDescriptors[i].getName(); mybatis 不存在实体属性 不用处理别名的情况
name = origDescriptors[i].getName();
type = origDescriptors[i].getPropertyType().toString();
try {
if (judgedIsUselessField(name) || !PropertyUtils.isReadable(searchObj, name) || (excludeFields != null && excludeFields.contains(name))) {
continue;
}
// 添加 判断是否有区间值
String endValue = null, beginValue = null;
if (parameterMap != null && parameterMap.containsKey(name + BEGIN)) {
beginValue = parameterMap.get(name + BEGIN)[0].trim();
addQueryByRule(queryWrapper, name, type, beginValue, QueryRuleEnum.GE);
}
if (parameterMap != null && parameterMap.containsKey(name + END)) {
endValue = parameterMap.get(name + END)[0].trim();
addQueryByRule(queryWrapper, name, type, endValue, QueryRuleEnum.LE);
}
//判断单值 参数带不同标识字符串 走不同的查询
//TODO 这种前后带逗号的支持分割后模糊查询需要否 使多选字段的查询生效
Object value = PropertyUtils.getSimpleProperty(searchObj, name);
if (null != value && value.toString().startsWith(COMMA) && value.toString().endsWith(COMMA)) {
String multiLikeval = value.toString().replace(",,", COMMA);
String[] vals = multiLikeval.substring(1, multiLikeval.length()).split(COMMA);
final String field = oConvertUtils.camelToUnderline(name);
if (vals.length > 1) {
queryWrapper.and(j -> {
j = j.like(field, vals[0]);
for (int k = 1; k < vals.length; k++) {
j = j.or().like(field, vals[k]);
}
//return j;
});
} else {
queryWrapper.and(j -> j.like(field, vals[0]));
}
} else {
//根据参数值带什么关键字符串判断走什么类型的查询
QueryRuleEnum rule = convert2Rule(value);
value = replaceValue(rule, value);
addEasyQuery(queryWrapper, name, rule, value);
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 排序逻辑 处理
doMultiFieldsOrder(queryWrapper, parameterMap);
//高级查询
doSuperQuery(queryWrapper, parameterMap);
}
/**
* 组装Mybatis Plus 查询条件
* <p>使用此方法 需要有如下几点注意:
@ -87,12 +175,12 @@ public class QueryGenerator {
name = origDescriptors[i].getName();
type = origDescriptors[i].getPropertyType().toString();
try {
if (judgedIsUselessField(name)|| !PropertyUtils.isReadable(searchObj, name)) {
if (judgedIsUselessField(name) || !PropertyUtils.isReadable(searchObj, name)) {
continue;
}
// 添加 判断是否有区间值
String endValue = null,beginValue = null;
String endValue = null, beginValue = null;
if (parameterMap != null && parameterMap.containsKey(name + BEGIN)) {
beginValue = parameterMap.get(name + BEGIN)[0].trim();
addQueryByRule(queryWrapper, name, type, beginValue, QueryRuleEnum.GE);
@ -110,21 +198,21 @@ public class QueryGenerator {
String multiLikeval = value.toString().replace(",,", COMMA);
String[] vals = multiLikeval.substring(1, multiLikeval.length()).split(COMMA);
final String field = oConvertUtils.camelToUnderline(name);
if(vals.length>1) {
if (vals.length > 1) {
queryWrapper.and(j -> {
j = j.like(field,vals[0]);
for (int k=1;k<vals.length;k++) {
j = j.or().like(field,vals[k]);
j = j.like(field, vals[0]);
for (int k = 1; k < vals.length; k++) {
j = j.or().like(field, vals[k]);
}
//return j;
});
}else {
queryWrapper.and(j -> j.like(field,vals[0]));
} else {
queryWrapper.and(j -> j.like(field, vals[0]));
}
}else {
} else {
//根据参数值带什么关键字符串判断走什么类型的查询
QueryRuleEnum rule = convert2Rule(value);
value = replaceValue(rule,value);
value = replaceValue(rule, value);
addEasyQuery(queryWrapper, name, rule, value);
}
@ -142,16 +230,16 @@ public class QueryGenerator {
//多字段排序 TODO 需要修改前端
public static void doMultiFieldsOrder(QueryWrapper<?> queryWrapper, Map<String, String[]> parameterMap) {
String column=null,order=null;
if(parameterMap!=null&& parameterMap.containsKey(ORDER_COLUMN)) {
String column = null, order = null;
if (parameterMap != null && parameterMap.containsKey(ORDER_COLUMN)) {
column = parameterMap.get(ORDER_COLUMN)[0];
}
if(parameterMap!=null&& parameterMap.containsKey(ORDER_TYPE)) {
if (parameterMap != null && parameterMap.containsKey(ORDER_TYPE)) {
order = parameterMap.get(ORDER_TYPE)[0];
}
log.info("排序规则>>列:"+column+",排序方式:"+order);
log.info("排序规则>>列:" + column + ",排序方式:" + order);
if (oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) {
if (order.toUpperCase().indexOf(ORDER_TYPE_ASC)>=0) {
if (order.toUpperCase().indexOf(ORDER_TYPE_ASC) >= 0) {
queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column));
} else {
queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column));
@ -161,11 +249,12 @@ public class QueryGenerator {
/**
* 高级查询
*
* @param queryWrapper
* @param parameterMap
*/
public static void doSuperQuery(QueryWrapper<?> queryWrapper, Map<String, String[]> parameterMap) {
if(parameterMap!=null&& parameterMap.containsKey(SUPER_QUERY_PARAMS)){
if (parameterMap != null && parameterMap.containsKey(SUPER_QUERY_PARAMS)) {
String superQueryParams = parameterMap.get(SUPER_QUERY_PARAMS)[0];
// 解码
try {
@ -175,18 +264,20 @@ public class QueryGenerator {
e.printStackTrace();
}
List<QueryCondition> conditions = JSON.parseArray(superQueryParams, QueryCondition.class);
log.info("---高级查询参数-->"+conditions.toString());
log.info("---高级查询参数-->" + conditions.toString());
for (QueryCondition rule : conditions) {
if(oConvertUtils.isNotEmpty(rule.getField()) && oConvertUtils.isNotEmpty(rule.getRule()) && oConvertUtils.isNotEmpty(rule.getVal())){
if (oConvertUtils.isNotEmpty(rule.getField()) && oConvertUtils.isNotEmpty(rule.getRule()) && oConvertUtils.isNotEmpty(rule.getVal())) {
addEasyQuery(queryWrapper, rule.getField(), QueryRuleEnum.getByValue(rule.getRule()), rule.getVal());
}
}
}
}
/**
* 根据所传的值 转化成对应的比较方式
* 支持><= like in !
*
* @param value
* @return
*/
@ -211,7 +302,7 @@ public class QueryGenerator {
rule = QueryRuleEnum.LIKE;
} else if (val.startsWith(STAR)) {
rule = QueryRuleEnum.LEFT_LIKE;
} else if(val.endsWith(STAR)){
} else if (val.endsWith(STAR)) {
rule = QueryRuleEnum.RIGHT_LIKE;
}
}
@ -221,7 +312,7 @@ public class QueryGenerator {
rule = QueryRuleEnum.IN;
}
// step 5 !=
if(rule == null && val.startsWith(NOT_EQUAL)){
if (rule == null && val.startsWith(NOT_EQUAL)) {
rule = QueryRuleEnum.NE;
}
return rule != null ? rule : QueryRuleEnum.EQ;
@ -238,7 +329,7 @@ public class QueryGenerator {
if (rule == null) {
return null;
}
if (! (value instanceof String)){
if (!(value instanceof String)) {
return value;
}
String val = (value + "").toString().trim();
@ -251,13 +342,13 @@ public class QueryGenerator {
} else if (rule == QueryRuleEnum.IN) {
value = val.split(",");
} else {
value = val.replace(rule.getValue(),"");
value = val.replace(rule.getValue(), "");
}
return value;
}
private static void addQueryByRule(QueryWrapper<?> queryWrapper, String name, String type, String value, QueryRuleEnum rule) throws ParseException {
if(!"".equals(value)) {
if (!"".equals(value)) {
Object temp;
switch (type) {
case "class java.lang.Integer":
@ -291,24 +382,25 @@ public class QueryGenerator {
/**
* 获取日期类型的值
*
* @param value
* @param rule
* @return
* @throws ParseException
*/
private static Date getDateQueryByRule(String value,QueryRuleEnum rule) throws ParseException {
private static Date getDateQueryByRule(String value, QueryRuleEnum rule) throws ParseException {
Date date = null;
if(value.length()==10) {
if(rule==QueryRuleEnum.GE) {
if (value.length() == 10) {
if (rule == QueryRuleEnum.GE) {
//比较大于
date = getTime().parse(value + " 00:00:00");
}else if(rule==QueryRuleEnum.LE) {
} else if (rule == QueryRuleEnum.LE) {
//比较小于
date = getTime().parse(value + " 23:59:59");
}
//TODO 日期类型比较特殊 可能oracle下不一定好使
}
if(date==null) {
if (date == null) {
date = getTime().parse(value);
}
return date;
@ -316,6 +408,7 @@ public class QueryGenerator {
/**
* 根据规则走不同的查询
*
* @param queryWrapper QueryWrapper
* @param name 字段名字
* @param rule 查询规则
@ -326,7 +419,7 @@ public class QueryGenerator {
return;
}
name = oConvertUtils.camelToUnderline(name);
log.info("--查询规则-->"+name+" "+rule.getValue()+" "+value);
log.info("--查询规则-->" + name + " " + rule.getValue() + " " + value);
switch (rule) {
case GT:
queryWrapper.gt(name, value);
@ -347,11 +440,11 @@ public class QueryGenerator {
queryWrapper.ne(name, value);
break;
case IN:
if(value instanceof String) {
queryWrapper.in(name, (Object[])value.toString().split(","));
}else if(value instanceof String[]) {
if (value instanceof String) {
queryWrapper.in(name, (Object[]) value.toString().split(","));
} else if (value instanceof String[]) {
queryWrapper.in(name, (Object[]) value);
}else {
} else {
queryWrapper.in(name, value);
}
break;
@ -369,8 +462,8 @@ public class QueryGenerator {
break;
}
}
/**
*
* @param name
* @return
*/
@ -381,10 +474,4 @@ public class QueryGenerator {
}
}