You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Camunda 7.19.0中如何用ConditionQueryParameterDto实现in运算符查询?

实现Camunda 7.19.0任务查询的“in”运算符功能

问题背景

我正在使用Camunda 7.19.0版本,已实现一个接收TaskQueryDto的控制器,用于根据指定变量条件查询所有任务,控制器代码如下:

@RestController
public class RestEngineController {

    @Autowired
    private TaskCustomService taskCustomService;

    @PostMapping(value = "/rest-engine/task-with-variables", produces = MediaType.APPLICATION_JSON_VALUE)
    List<TaskWithVariables> getTasks(@RequestBody TaskQueryDto query,
                                     @RequestParam("firstResult") Integer firstResult,
                                     @RequestParam("maxResults") Integer maxResults) {
        return taskCustomService.getTasks(query, firstResult, maxResults);
    }
}

但Camunda原生的ConditionQueryParameterDto并未提供“in”运算符支持,该类相关代码片段如下:

public class ConditionQueryParameterDto {

  public ConditionQueryParameterDto() {

  }

  public static final String EQUALS_OPERATOR_NAME = "eq";
  public static final String NOT_EQUALS_OPERATOR_NAME = "neq";
  public static final String GREATER_THAN_OPERATOR_NAME = "gt";
  public static final String GREATER_THAN_OR_EQUALS_OPERATOR_NAME = "gteq";
  public static final String LESS_THAN_OPERATOR_NAME = "lt";
  public static final String LESS_THAN_OR_EQUALS_OPERATOR_NAME = "lteq";
  public static final String LIKE_OPERATOR_NAME = "like";
  public static final String NOT_LIKE_OPERATOR_NAME = "notLike";
}

解决方案

1. 在业务逻辑中新增“in”运算符处理

无需修改Camunda原生DTO,直接在TaskCustomService的查询方法中,对传入的运算符做额外判断,利用Camunda TaskQuery提供的taskVariableValueIn方法实现in查询:

import org.camunda.bpm.engine.TaskService;
import org.camunda.bpm.engine.task.Task;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class TaskCustomService {

    private final TaskService taskService;

    public TaskCustomService(TaskService taskService) {
        this.taskService = taskService;
    }

    public List<TaskWithVariables> getTasks(TaskQueryDto queryDto, Integer firstResult, Integer maxResults) {
        TaskQuery taskQuery = taskService.createTaskQuery();

        // 处理变量条件,新增in运算符支持
        if (queryDto.getVariables() != null) {
            for (Map.Entry<String, ConditionQueryParameterDto> varEntry : queryDto.getVariables().entrySet()) {
                String varName = varEntry.getKey();
                ConditionQueryParameterDto condition = varEntry.getValue();

                if ("in".equals(condition.getOperator())) {
                    // 确保传入的value是集合类型(如List)
                    if (condition.getValue() instanceof List) {
                        List<?> varValues = (List<?>) condition.getValue();
                        taskQuery.taskVariableValueIn(varName, varValues.toArray());
                    }
                } else {
                    // 原有其他运算符的处理逻辑(保持原代码不变)
                    switch (condition.getOperator()) {
                        case ConditionQueryParameterDto.EQUALS_OPERATOR_NAME:
                            taskQuery.taskVariableValueEquals(varName, condition.getValue());
                            break;
                        case ConditionQueryParameterDto.NOT_EQUALS_OPERATOR_NAME:
                            taskQuery.taskVariableValueNotEquals(varName, condition.getValue());
                            break;
                        // 其他运算符处理...
                        default:
                            throw new IllegalArgumentException("Unsupported operator: " + condition.getOperator());
                    }
                }
            }
        }

        // 分页设置
        taskQuery.firstResult(firstResult).maxResults(maxResults);

        // 查询任务并封装为TaskWithVariables
        List<Task> tasks = taskQuery.list();
        return tasks.stream().map(task -> {
            TaskWithVariables result = new TaskWithVariables();
            result.setTaskId(task.getId());
            result.setName(task.getName());
            // 其他任务字段赋值...
            result.setVariables(taskService.getVariables(task.getId()));
            return result;
        }).collect(Collectors.toList());
    }
}

2. 前端请求格式约定

前端发起请求时,需按照约定传入“in”类型的变量条件,示例JSON如下:

{
  "variables": {
    "orderStatus": {
      "operator": "in",
      "value": ["COMPLETED", "CANCELLED"],
      "type": "String"
    }
  }
}

3. 可选:扩展DTO实现强类型支持

如果希望在DTO层面明确支持“in”运算符,可以自定义扩展DTO:

public class ExtendedConditionQueryParameterDto extends ConditionQueryParameterDto {
    public static final String IN_OPERATOR_NAME = "in";
}

// 自定义TaskQueryDto
public class ExtendedTaskQueryDto extends TaskQueryDto {
    private Map<String, ExtendedConditionQueryParameterDto> variables;

    @Override
    public Map<String, ConditionQueryParameterDto> getVariables() {
        return Map.copyOf(variables);
    }

    public Map<String, ExtendedConditionQueryParameterDto> getExtendedVariables() {
        return variables;
    }

    public void setVariables(Map<String, ExtendedConditionQueryParameterDto> variables) {
        this.variables = variables;
    }
}

之后控制器修改为接收ExtendedTaskQueryDto:

@PostMapping(value = "/rest-engine/task-with-variables", produces = MediaType.APPLICATION_JSON_VALUE)
List<TaskWithVariables> getTasks(@RequestBody ExtendedTaskQueryDto query,
                                 @RequestParam("firstResult") Integer firstResult,
                                 @RequestParam("maxResults") Integer maxResults) {
    return taskCustomService.getTasks(query, firstResult, maxResults);
}

内容的提问来源于stack exchange,提问作者Pertsh Galstyan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 21:10:06