activiti学习(十八)

264 阅读2分钟

image.png 持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情

Activiti的使用

web项目,经常需要的操作是CRUD,我们学完了操作数据的API,接下来看看怎么查询Activiti中的数据。

Activiti中的查询API

有两种从引擎查询数据的方法:查询API和原生查询。查询API允许使用fluent API编程完全类型安全的查询。我们可以将各种条件添加到查询中(所有这些条件都作为AND一起作用在查询语句上),并以我们添加的顺序拼接查询条件。如下是一个查询:

List<Task> tasks = taskService.createTaskQuery()
    .taskAssignee("kermit")
    .processVariableValueEquals("orderId", "0815")
    .orderByDueDate().asc()
    .list();

有时,系统自带的查询API满足不了我们的时候,如使用OR运算符的查询或使用查询API无法表达的限制。对于这些情况。Activiti提供了原生查询,它允许我们编写自己的查询SQL。返回我们自定义的查询对象,这需要我们做数据库表的列名和字段名的映射关系处理,例如Task, ProcessInstance, Execution等。 由于查询将在数据库中执行,因此必须使用数据库中定义的表名和列名;这要求我们对数据库中表定义有所了解,请谨慎使用。可以通过API获取表名,以便减少对数据库层面的依赖。如下:

List<Task> tasks = taskService.createNativeTaskQuery()
  .sql("SELECT count(*) FROM " + managementService.getTableName(Task.class) + " T WHERE T.NAME_ = #{taskName}")
  .parameter("taskName", "gonzoTask")
  .list();

long count = taskService.createNativeTaskQuery()
  .sql("SELECT count(*) FROM " + managementService.getTableName(Task.class) + " T1, "
    + managementService.getTableName(VariableInstanceEntity.class) + " V1 WHERE V1.TASK_ID_ = T1.ID_")
  .count();

Activiti中的变量(Variables)

每个流程实例都需要使用数据来执行流程的任务。在Activiti中,这些数据称为变量(Variables),存储在数据库中。变量可以在表达式中使用(例如,在网关中通过变量选择合适的流程走向),在调用外部服务时在java服务任务中使用(例如,提供输入或存储服务调用的结果),等等。
流程实例可以有变量(称为流程变量),用户任务可以有变量。流程实例可以持有多个变量。每个变量都存储在ACT_RU_VARIABLE数据库表中的一行中。
任何startProcessInstanceXXX方法都有一个可选参数,用于在创建和启动流程实例时提供变量。例如,从RuntimeService:

ProcessInstance startProcessInstanceByKey(String processDefinitionKey, Map<String, Object> variables);

可以为给定的流程节点设定局部变量(请记住,流程实例由任务树组成)。该变量将仅在该任务中可见,而不会在任务树的上层位置可见。如果不想将数据传播到流程实例级别,或者变量具有流程实例中某个路径的新值(例如,当任务并发时),这可能很有用。