每个流程定义都可能会有好几个版本,所以有时候我们有这样的需求,查询出最新版本的流程定义的集合
一般的思路是这样的:
第一步:我们通过Activiti接口来获取根据流程定义Version升序排序的流程定义的集合;
第二步:定义一个有序的Map, Map的key就是我们流程定义的Key,Map的值就是流程定义对象;
第三步:我们遍历第一步的集合,put(key,value) 假如Key相同,后者会覆盖前者;
第四步:我们获取Map的values。即我们需要的最新版本的流程定义的集合;
先看看数据库中的记录
代码实现:
package com.gcx.activiti.table;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.ProcessDefinition;
import org.junit.Test;
public class Search {
private ProcessEngine processEngine=ProcessEngines.getDefaultProcessEngine();
/**
* 查询最新版本的流程定义
* @throws IOException
*/
@Test
public void listLastVersion() {
List<ProcessDefinition> list = processEngine.getRepositoryService()
.createProcessDefinitionQuery()
.orderByProcessDefinitionVersion().asc()//升序
.list();
//定义有序map,相同的key,添加map值后,后面的会覆盖前面的值
Map<String,ProcessDefinition> map=new LinkedHashMap<String,ProcessDefinition>();
//遍历相同的key,替换最新的值
for(ProcessDefinition pd:list){
map.put(pd.getKey(), pd);
}
List<ProcessDefinition> linkedList=new LinkedList<ProcessDefinition>(map.values());
for(ProcessDefinition pd:linkedList){
System.out.println(pd.getId());
System.out.println(pd.getName());
System.out.println(pd.getVersion());
}
}
}
结果如下: