Bladeren bron

通用查询条件支持or
对象扩展条件适配or

yucheng 3 jaren geleden
bovenliggende
commit
c2dd5a7376

+ 7 - 140
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/controller/ObjectDigitalController.java

@@ -1,11 +1,8 @@
 package com.persagy.dmp.rwd.digital.controller;
 
 import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.ReflectUtil;
-import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.basic.model.QueryCriteria;
@@ -14,13 +11,13 @@ import com.persagy.dmp.basic.utils.QueryCriteriaHelper;
 import com.persagy.dmp.common.constant.CommonConstant;
 import com.persagy.dmp.common.constant.ResponseCode;
 import com.persagy.dmp.common.exception.BusinessException;
-import com.persagy.dmp.common.model.entity.BaseEntity;
 import com.persagy.dmp.common.model.response.CommonResult;
 import com.persagy.dmp.common.utils.ParamCheckUtil;
 import com.persagy.dmp.common.utils.ResultHelper;
 import com.persagy.dmp.mybatis.utils.ConditionUtil;
 import com.persagy.dmp.rwd.digital.entity.ObjectDigital;
 import com.persagy.dmp.rwd.digital.service.IObjectDigitalService;
+import com.persagy.dmp.rwd.digital.utils.ObjectDigitalCriteriaHelper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -28,9 +25,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
-import java.util.Iterator;
 import java.util.List;
-import java.util.Set;
 
 /**
  * 对象数据 Controller
@@ -56,149 +51,21 @@ public class ObjectDigitalController{
         // 添加所属项目条件
         ConditionUtil.ensureProjectCriteria(wrapper);
         // 处理扩展条件
-        ensureExtraCond(wrapper, criteria.getCriteria());
+        ObjectDigitalCriteriaHelper.ensureExtraCond(criteria.getCriteria());
         // 转换查询条件
         QueryCriteriaHelper.toWrapper(wrapper, criteria);
         Page page = service.queryByCondition(QueryCriteriaHelper.toPage(criteria), wrapper);
         // 处理扩展属性
-        List<ObjectNode> records = JsonNodeUtils.toListNode(page.getRecords(), "infos", criteria.getWithColumns());
+        List<ObjectNode> records = JsonNodeUtils.toListNode(page.getRecords(), ObjectDigital.EXTRA_COLUMN, criteria.getWithColumns());
         return ResultHelper.multi(records, page.getTotal());
     }
 
-    /**
-     * 拼接扩展条件
-     * @param wrapper
-     * @param criteria
-     */
-    private void ensureExtraCond(QueryWrapper<ObjectDigital> wrapper, ObjectNode criteria) {
-        ensureSearchCond(wrapper, criteria);
-        ensureRelationCond(wrapper, criteria);
-        ensureJsonCond(wrapper, criteria);
-    }
-
-    /**
-     * 拼接json条件
-     * @param wrapper
-     * @param criteria
-     */
-    private void ensureJsonCond(QueryWrapper<ObjectDigital> wrapper, ObjectNode criteria) {
-        Set<String> fieldSet = ReflectUtil.getFieldMap(ObjectDigital.class).keySet();
-        Iterator<String> fieldNames = criteria.fieldNames();
-        while (fieldNames.hasNext()) {
-            String infoCode = fieldNames.next();
-            // 基础属性不用处理
-            if(fieldSet.contains(infoCode)) {
-                continue;
-            }
-            // 20210813增加ADM传sql特殊处理 - 不公开到接口文档中
-            if("$sql".equalsIgnoreCase(infoCode)) {
-                continue;
-            }
-            JsonNode value = criteria.get(infoCode);
-            if(value == null || value.isNull()) {
-                continue;
-            }
-            // 如果值是对象
-            if(value.isObject()) {
-                // 包含
-                if (value.has("$contains")) {
-                    JsonNode valueNode = value.get("$contains");
-                    String valueStr = valueNode.isTextual() ? value.asText():value.toString();
-                    wrapper.eq(StrUtil.format("json_contains({}, {}, '$.{}')", "infos", valueStr, infoCode), 1);
-                } else if (value.has("$notcontains")) {
-                    // 不包含
-                    JsonNode valueNode = value.get("$notcontains");
-                    String valueStr = valueNode.isTextual() ? value.asText():value.toString();
-                    wrapper.eq(StrUtil.format("json_contains({}, {}, '$.{}')", "infos", valueStr, infoCode), 0);
-                }
-            } else if(value.isTextual()) {
-                wrapper.eq(StrUtil.format("json_unquote(json_extract({}, '$.{}'))", "infos", infoCode), value.asText());
-            } else if(value.isInt()) {
-                wrapper.eq(StrUtil.format("ifnull(json_extract({}, '$.{}'), -9999)", "infos", infoCode), value.asInt());
-            } else if(value.isDouble()) {
-                wrapper.eq(StrUtil.format("ifnull(json_extract({}, '$.{}'), -9999.99)", "infos", infoCode), value.asDouble());
-            }
-            // 处理完成后删除
-            fieldNames.remove();
-        }
-    }
-
-    /**
-     * 拼接$search条件
-     * @param wrapper
-     * @param criteria
-     */
-    private void ensureSearchCond(QueryWrapper<ObjectDigital> wrapper, ObjectNode criteria) {
-        if(criteria == null || criteria.isNull()) {
-            return;
-        }
-        // 处理relationFrom
-        JsonNode search = criteria.get("$search");
-        if(search != null && search.isTextual()) {
-            String searchValue = search.asText();
-            wrapper.isNotNull(StrUtil.format("json_search({0}, 'one', {1})", "infos", searchValue));
-            // 处理完成后删除
-            criteria.remove("$search");
-        }
-    }
-
-    /**
-     * 处理关系条件
-     * @param wrapper
-     * @param criteria
-     */
-    private void ensureRelationCond(QueryWrapper<ObjectDigital> wrapper, ObjectNode criteria) {
-        if(criteria == null || criteria.isNull()) {
-            return;
-        }
-        // 处理relationFrom
-        JsonNode relationFrom = criteria.get("relationFrom");
-        if(relationFrom != null && relationFrom.isObject() && relationFrom.size() > 0) {
-            StringBuilder inSql = new StringBuilder("(select obj_from from dt_relation where 1=1 ");
-            addWhereCond(relationFrom, inSql, "graphId");
-            addWhereCond(relationFrom, inSql, "graphCode");
-            addWhereCond(relationFrom, inSql, "relCode");
-            addWhereCond(relationFrom, inSql, "objTo");
-            inSql.append(")");
-            wrapper.inSql(BaseEntity.PROP_ID, inSql.toString());
-            // 处理完成后删除
-            criteria.remove("relationFrom");
-        }
-        // 处理relationTo
-        JsonNode relationTo = criteria.get("relationTo");
-        if(relationTo != null && relationTo.isObject() && relationTo.size() > 0) {
-            StringBuilder inSql = new StringBuilder("(select obj_to from dt_relation where 1=1 ");
-            addWhereCond(relationTo, inSql, "graphId");
-            addWhereCond(relationTo, inSql, "graphCode");
-            addWhereCond(relationTo, inSql, "relCode");
-            addWhereCond(relationTo, inSql, "objFrom");
-            inSql.append(")");
-            wrapper.inSql(BaseEntity.PROP_ID, inSql.toString());
-            // 处理完成后删除
-            criteria.remove("relationTo");
-        }
-    }
-
-    /**
-     * 添加where条件
-     * @param node json对象
-     * @param inSql in条件
-     * @param field 属性名
-     */
-    private void addWhereCond(JsonNode node, StringBuilder inSql, String field) {
-        String value = (String) JsonNodeUtils.getNodeValue(node.get(field));
-        if(StrUtil.isNotEmpty(value)) {
-            String column = StrUtil.toUnderlineCase(field);
-            inSql.append("and " + column + " = '" + value + "' ");
-        }
-    }
-
     @PostMapping("/createOne")
     public CommonResult<ObjectDigital> create(@Valid @RequestBody ObjectNode node){
         //基础参数校验
         ParamCheckUtil.checkParam(CommonConstant.QUERY_GROUPCODE,CommonConstant.QUERY_PROJECTID);
 
-        ObjectDigital vo = JsonNodeUtils.toEntity(node, ObjectDigital.class, "infos");
+        ObjectDigital vo = JsonNodeUtils.toEntity(node, ObjectDigital.class, ObjectDigital.EXTRA_COLUMN);
         List<ObjectDigital> voList = CollUtil.newArrayList(vo);
         service.insert(voList);
         return ResultHelper.single(vo);
@@ -209,7 +76,7 @@ public class ObjectDigitalController{
         //基础参数校验
         ParamCheckUtil.checkParam(CommonConstant.QUERY_GROUPCODE,CommonConstant.QUERY_PROJECTID);
 
-        List<ObjectDigital> voList = JsonNodeUtils.toEntity(array, ObjectDigital.class, "infos");
+        List<ObjectDigital> voList = JsonNodeUtils.toEntity(array, ObjectDigital.class, ObjectDigital.EXTRA_COLUMN);
         voList = service.insert(voList);
         return ResultHelper.multi(voList);
     }
@@ -219,7 +86,7 @@ public class ObjectDigitalController{
         //基础参数校验
         ParamCheckUtil.checkParam(CommonConstant.QUERY_GROUPCODE,CommonConstant.QUERY_PROJECTID);
 
-        ObjectDigital vo = JsonNodeUtils.toEntity(node, ObjectDigital.class, "infos");
+        ObjectDigital vo = JsonNodeUtils.toEntity(node, ObjectDigital.class, ObjectDigital.EXTRA_COLUMN);
         List<ObjectDigital> voList = CollUtil.newArrayList(vo);
         service.update(voList);
         return ResultHelper.single(vo);
@@ -230,7 +97,7 @@ public class ObjectDigitalController{
         //基础参数校验
         ParamCheckUtil.checkParam(CommonConstant.QUERY_GROUPCODE,CommonConstant.QUERY_PROJECTID);
 
-        List<ObjectDigital> voList = JsonNodeUtils.toEntity(array, ObjectDigital.class, "infos");
+        List<ObjectDigital> voList = JsonNodeUtils.toEntity(array, ObjectDigital.class, ObjectDigital.EXTRA_COLUMN);
         voList = service.update(voList);
         return ResultHelper.multi(voList);
     }

+ 4 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/entity/ObjectDigital.java

@@ -19,6 +19,10 @@ import java.util.List;
 @EqualsAndHashCode(callSuper = true)
 @TableName(value = "dt_object",autoResultMap = true)
 public class ObjectDigital extends AuditableEntity {
+
+    /** 扩展属性列 */
+    public static final String EXTRA_COLUMN = "infos";
+
     /** 项目ID */
     private String projectId;
     /** 名称 */

+ 197 - 0
dmp-business/dmp-rwd/src/main/java/com/persagy/dmp/rwd/digital/utils/ObjectDigitalCriteriaHelper.java

@@ -0,0 +1,197 @@
+package com.persagy.dmp.rwd.digital.utils;
+
+import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.ReflectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.persagy.dmp.basic.model.QueryOperator;
+import com.persagy.dmp.basic.utils.JsonNodeUtils;
+import com.persagy.dmp.common.model.entity.BaseEntity;
+import com.persagy.dmp.rwd.digital.entity.ObjectDigital;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * 对象 查询条件 助手
+ * 增加对对象专属条件的处理
+ * @author Charlie Yu
+ * @date 2021-08-16
+ */
+public class ObjectDigitalCriteriaHelper {
+
+    /** 对象类字段集 */
+    private static final Set<String> DIGITAL_FIELDS = ReflectUtil.getFieldMap(ObjectDigital.class).keySet();
+
+    /**
+     * 拼接扩展条件
+     * 暂用#JSON#表示是json条件,不处理驼峰
+     * @param criteria
+     */
+    public static void ensureExtraCond(ObjectNode criteria) {
+        ensureSearchCond(criteria);
+        ensureRelationCond(criteria);
+        ensureJsonCond(criteria);
+    }
+
+    /**
+     * 拼接json条件
+     * @param criteria
+     */
+    private static void ensureJsonCond(ObjectNode criteria) {
+        Iterator<String> fieldNames = criteria.fieldNames();
+        Map<String, JsonNode> valueMap = new HashMap<>();
+        while (fieldNames.hasNext()) {
+            String infoCode = fieldNames.next();
+            // 基础属性不用处理
+            if(DIGITAL_FIELDS.contains(infoCode)) {
+                continue;
+            }
+            JsonNode value = criteria.get(infoCode);
+            if(value == null || value.isNull()) {
+                continue;
+            }
+            // 如果是or条件
+            if(QueryOperator.OR.getIndex().equalsIgnoreCase(infoCode)) {
+                processOrCond(value);
+                continue;
+            }
+            // 如果值是对象
+            if(value.isObject()) {
+                // 包含
+                if (value.has(QueryOperator.CONTAINS.getIndex())) {
+                    JsonNode valueNode = value.get(QueryOperator.CONTAINS.getIndex());
+                    String valueStr = valueNode.isTextual() ? value.asText():value.toString();
+                    String key = StrUtil.format("#JSON#json_contains({}, {}, '$.{}')", ObjectDigital.EXTRA_COLUMN, valueStr, infoCode);
+                    valueMap.put(key, criteria.numberNode(1));
+                } else if (value.has(QueryOperator.NOT_CONTAINS.getIndex())) {
+                    // 不包含
+                    JsonNode valueNode = value.get(QueryOperator.NOT_CONTAINS.getIndex());
+                    String valueStr = valueNode.isTextual() ? value.asText():value.toString();
+                    String key = StrUtil.format("#JSON#json_contains({}, {}, '$.{}')", ObjectDigital.EXTRA_COLUMN, valueStr, infoCode);
+                    valueMap.put(key, criteria.numberNode(0));
+                }
+            } else if(value.isTextual()) {
+                String key = StrUtil.format("#JSON#json_unquote(json_extract({}, '$.{}'))", ObjectDigital.EXTRA_COLUMN, infoCode);
+                valueMap.put(key, value);
+            } else if(value.isInt()) {
+                String key = StrUtil.format("#JSON#ifnull(json_extract({}, '$.{}'), -9999)", ObjectDigital.EXTRA_COLUMN, infoCode);
+                valueMap.put(key, value);
+            } else if(value.isDouble()) {
+                String key = StrUtil.format("#JSON#ifnull(json_extract({}, '$.{}'), -9999.99)", ObjectDigital.EXTRA_COLUMN, infoCode);
+                valueMap.put(key, value);
+            }
+            // 处理完成后删除
+            fieldNames.remove();
+        }
+        // 将valueMap写入criteria中
+        if(MapUtil.isEmpty(valueMap)) {
+            return;
+        }
+        for(String key:valueMap.keySet()) {
+            criteria.set(key, valueMap.get(key));
+        }
+    }
+
+    /**
+     * 处理or条件
+     * @param node
+     */
+    private static void processOrCond(JsonNode node) {
+        if(node == null || node.isNull()) {
+            return;
+        }
+        // 如果是数组 - 递归继续处理即可
+        if(node.isArray()) {
+            Iterator<JsonNode> elements = node.elements();
+            while (elements.hasNext()) {
+                // 递归继续处理
+                JsonNode objNode = elements.next();
+                processOrCond(objNode);
+            }
+            return;
+        }
+        // 如果是对象,则转换条件
+        if(node.isObject()) {
+            // 对象 递归从头开始处理
+            ObjectNode obj = (ObjectNode) node;
+            ensureExtraCond(obj);
+            return;
+        }
+    }
+
+    /**
+     * 拼接$search条件
+     * @param criteria
+     */
+    private static void ensureSearchCond(ObjectNode criteria) {
+        if(criteria == null || criteria.isNull()) {
+            return;
+        }
+        // 处理search
+        JsonNode search = criteria.get(QueryOperator.SEARCH.getIndex());
+        if(search != null && search.isTextual()) {
+            String searchValue = search.asText();
+            String key = StrUtil.format("#JSON#json_search({0}, 'one', {1})", ObjectDigital.EXTRA_COLUMN, searchValue);
+            ObjectNode searchObj = criteria.putObject(key);
+            searchObj.put(QueryOperator.NULL.getIndex(), false);
+            // 处理完成后删除
+            criteria.remove(QueryOperator.SEARCH.getIndex());
+        }
+    }
+
+    /**
+     * 处理关系条件
+     * @param criteria
+     */
+    private static void ensureRelationCond(ObjectNode criteria) {
+        if(criteria == null || criteria.isNull()) {
+            return;
+        }
+        // 处理relationFrom
+        JsonNode relationFrom = criteria.get(QueryOperator.RELATION_FROM.getIndex());
+        if(relationFrom != null && relationFrom.isObject() && relationFrom.size() > 0) {
+            StringBuilder inSql = new StringBuilder("(select obj_from from dt_relation where 1=1 ");
+            addWhereCond(relationFrom, inSql, "graphId");
+            addWhereCond(relationFrom, inSql, "graphCode");
+            addWhereCond(relationFrom, inSql, "relCode");
+            addWhereCond(relationFrom, inSql, "objTo");
+            inSql.append(")");
+            ObjectNode inObj = criteria.putObject(BaseEntity.PROP_ID);
+            inObj.put(QueryOperator.IN_SQL.getIndex(), inSql.toString());
+            // 处理完成后删除
+            criteria.remove(QueryOperator.RELATION_FROM.getIndex());
+        }
+        // 处理relationTo
+        JsonNode relationTo = criteria.get(QueryOperator.RELATION_TO.getIndex());
+        if(relationTo != null && relationTo.isObject() && relationTo.size() > 0) {
+            StringBuilder inSql = new StringBuilder("(select obj_to from dt_relation where 1=1 ");
+            addWhereCond(relationTo, inSql, "graphId");
+            addWhereCond(relationTo, inSql, "graphCode");
+            addWhereCond(relationTo, inSql, "relCode");
+            addWhereCond(relationTo, inSql, "objFrom");
+            inSql.append(")");
+            ObjectNode inObj = criteria.putObject(BaseEntity.PROP_ID);
+            inObj.put(QueryOperator.IN_SQL.getIndex(), inSql.toString());
+            // 处理完成后删除
+            criteria.remove(QueryOperator.RELATION_TO.getIndex());
+        }
+    }
+
+    /**
+     * 添加where条件
+     * @param node json对象
+     * @param inSql in条件
+     * @param field 属性名
+     */
+    private static void addWhereCond(JsonNode node, StringBuilder inSql, String field) {
+        String value = (String) JsonNodeUtils.getNodeValue(node.get(field));
+        if(StrUtil.isNotEmpty(value)) {
+            String column = StrUtil.toUnderlineCase(field);
+            inSql.append("and " + column + " = '" + value + "' ");
+        }
+    }
+}

+ 59 - 0
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/basic/model/QueryOperator.java

@@ -0,0 +1,59 @@
+package com.persagy.dmp.basic.model;
+
+import lombok.Getter;
+
+/**
+ * 查询条件
+ * @author Charlie Yu
+ * @date 2021-06-25
+ */
+@Getter
+public enum QueryOperator {
+
+    /** 查询条件 */
+    NE("$ne", "不等于"),
+    GT("$gt", "大于"),
+    GTE("$gte", "大于等于"),
+    LT("$lt", "小于"),
+    LTE("$lte", "小于等于"),
+    IN("$in", "等于"),
+    LIKE("$like", "包含"),
+    NOT_LIKE("$notLike", "不包含"),
+    NULL("$null", "空"),
+
+    CONTAINS("$contains", "包含"),
+    NOT_CONTAINS("$notcontains", "不包含"),
+    SEARCH("$search", "匹配"),
+    RELATION_FROM("relationFrom", "关系来源"),
+    RELATION_TO("relationTo", "关系目标"),
+
+    SQL("$sql", "SQL"),
+    IN_SQL("$inSql", "IN_SQL"),
+
+    AND("$and", "且"),
+    OR("$or", "或");
+
+
+    private String index;
+    private String name;
+
+    QueryOperator(String index, String name) {
+        this.index = index;
+        this.name = name;
+    }
+
+    /**
+     * 通过Index查找
+     * @param index
+     * @return
+     */
+    public static QueryOperator findByIndex(String index) {
+        QueryOperator[] values = QueryOperator.values();
+        for(QueryOperator value:values) {
+            if(value.getIndex().equalsIgnoreCase(index)) {
+                return value;
+            }
+        }
+        return null;
+    }
+}

+ 64 - 13
dmp-comp/dmp-digital-starter/src/main/java/com/persagy/dmp/basic/utils/QueryCriteriaHelper.java

@@ -4,7 +4,9 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
 import com.persagy.dmp.basic.model.QueryCriteria;
+import com.persagy.dmp.basic.model.QueryOperator;
 import com.persagy.dmp.common.model.entity.BaseEntity;
 
 import java.util.Iterator;
@@ -46,20 +48,38 @@ public class QueryCriteriaHelper {
      * @param wrapper
      */
     public static <T extends BaseEntity> void toWrapper(QueryWrapper<T> wrapper, QueryCriteria criteria) {
-        if(criteria == null || criteria.getCriteria() == null || criteria.getCriteria().isEmpty(null)) {
+        if(criteria == null) {
+            return;
+        }
+        toWrapper(wrapper, criteria.getCriteria());
+    }
+
+    /**
+     * 转换为查询条件
+     * @param wrapper
+     */
+    public static <T extends BaseEntity> void toWrapper(QueryWrapper<T> wrapper, ObjectNode criteria) {
+        if(criteria == null || criteria.isEmpty(null)) {
             return;
         }
-        Iterator<String> fields = criteria.getCriteria().fieldNames();
+        Iterator<String> fields = criteria.fieldNames();
         // 按字段循环
         while(fields.hasNext()) {
             String field = fields.next();
-            JsonNode fieldValue = criteria.getCriteria().get(field);
-            String dbField = StrUtil.toUnderlineCase(field);
+            JsonNode fieldValue = criteria.get(field);
+            // #JSON#开关的不转驼峰
+            String dbField = StrUtil.startWith(field, "#JSON#")?field.substring(6):StrUtil.toUnderlineCase(field);
             // 20210813增加ADM传sql特殊处理 - 不公开到接口文档中
             if("$sql".equalsIgnoreCase(field)) {
                 wrapper.apply((String)JsonNodeUtils.getNodeValue(fieldValue));
                 continue;
             }
+            // 20210816增加or条件支持
+            if(QueryOperator.OR.getIndex().equalsIgnoreCase(field)) {
+                // 内部重新创建QueryWrapper
+                wrapper.or(orWrapper -> addOrCondition(orWrapper, fieldValue));
+                continue;
+            }
             // 值节点
             if(fieldValue.isValueNode()) {
                 wrapper.eq(dbField, JsonNodeUtils.getNodeValue(fieldValue));
@@ -83,6 +103,35 @@ public class QueryCriteriaHelper {
     }
 
     /**
+     * 添加or条件
+     * @param wrapper
+     * @param node
+     * @param <T>
+     */
+    private static <T extends BaseEntity> void addOrCondition(QueryWrapper<T> wrapper, JsonNode node) {
+        if(node == null || node.isNull()) {
+            return;
+        }
+        // 如果是数组 - 递归继续处理即可
+        if(node.isArray()) {
+            Iterator<JsonNode> elements = node.elements();
+            while (elements.hasNext()) {
+                // 递归继续处理
+                JsonNode objNode = elements.next();
+                addOrCondition(wrapper, objNode);
+            }
+            return;
+        }
+        // 如果是对象,则转换条件
+        if(node.isObject()) {
+            // 对象 递归处理
+            ObjectNode obj = (ObjectNode) node;
+            toWrapper(wrapper, obj);
+            return;
+        }
+    }
+
+    /**
      * 按条件类型添加查询条件
      * @param wrapper
      * @param field
@@ -90,23 +139,25 @@ public class QueryCriteriaHelper {
      * @param valueNode
      */
     private static <T extends BaseEntity> void addCondition(QueryWrapper<T> wrapper, String field, String operator, JsonNode valueNode) {
-        if("$ne".equalsIgnoreCase(operator)) {
+        if(QueryOperator.NE.getIndex().equalsIgnoreCase(operator)) {
             wrapper.ne(field, JsonNodeUtils.getNodeValue(valueNode));
-        } else if("$gt".equalsIgnoreCase(operator)) {
+        } else if(QueryOperator.GT.getIndex().equalsIgnoreCase(operator)) {
             wrapper.gt(field, JsonNodeUtils.getNodeValue(valueNode));
-        } else if("$gte".equalsIgnoreCase(operator)) {
+        } else if(QueryOperator.GTE.getIndex().equalsIgnoreCase(operator)) {
             wrapper.ge(field, JsonNodeUtils.getNodeValue(valueNode));
-        } else if("$lt".equalsIgnoreCase(operator)) {
+        } else if(QueryOperator.LT.getIndex().equalsIgnoreCase(operator)) {
             wrapper.lt(field, JsonNodeUtils.getNodeValue(valueNode));
-        } else if("$lte".equalsIgnoreCase(operator)) {
+        } else if(QueryOperator.LTE.getIndex().equalsIgnoreCase(operator)) {
             wrapper.le(field, JsonNodeUtils.getNodeValue(valueNode));
-        } else if("$in".equalsIgnoreCase(operator)) {
+        } else if(QueryOperator.IN.getIndex().equalsIgnoreCase(operator)) {
             wrapper.in(field, JsonNodeUtils.getListValue(valueNode));
-        } else if("$like".equalsIgnoreCase(operator)) {
+        } else if(QueryOperator.IN_SQL.getIndex().equalsIgnoreCase(operator)) {
+            wrapper.inSql(field, (String) JsonNodeUtils.getNodeValue(valueNode));
+        } else if(QueryOperator.LIKE.getIndex().equalsIgnoreCase(operator)) {
             wrapper.like(field, JsonNodeUtils.getNodeValue(valueNode));
-        } else if("$notLike".equalsIgnoreCase(operator)) {
+        } else if(QueryOperator.NOT_LIKE.getIndex().equalsIgnoreCase(operator)) {
             wrapper.notLike(field, JsonNodeUtils.getNodeValue(valueNode));
-        } else if("$null".equalsIgnoreCase(operator)) {
+        } else if(QueryOperator.NULL.getIndex().equalsIgnoreCase(operator)) {
             boolean nullFlag = valueNode.booleanValue();
             if(nullFlag) {
                 wrapper.isNull(field);