SELECT RES.* , DEF.KEY_ as PROC_DEF_KEY_, DEF.NAME_ as PROC_DEF_NAME_, DEF.VERSION_ as PROC_DEF_VERSION_, DEF.DEPLOYMENT_ID_ as DEPLOYMENT_ID_ from ACT_HI_PROCINST RES leftouterjoin ACT_RE_PROCDEF DEF on RES.PROC_DEF_ID_ = DEF.ID_ WHERE RES.END_TIME_ isnot NULLorderby RES.ID_ asc
从这个 SQL 中可以看到,这个查询本质上就是查询的 ACT_HI_PROCINST 表。如下图:
如果我们在查询的时候不限制流程是否执行完毕,那么我们的查询方法如下:
1 2 3 4 5 6 7
@Test voidtest05() { List<HistoricProcessInstance> list = historyService.createHistoricProcessInstanceQuery().list(); for (HistoricProcessInstance hpi : list) { logger.info("name:{},startTime:{},endTime:{}",hpi.getName(),hpi.getStartTime(),hpi.getEndTime()); } }
对应的查询 SQL 如下:
1
SELECT RES.* , DEF.KEY_ as PROC_DEF_KEY_, DEF.NAME_ as PROC_DEF_NAME_, DEF.VERSION_ as PROC_DEF_VERSION_, DEF.DEPLOYMENT_ID_ as DEPLOYMENT_ID_ from ACT_HI_PROCINST RES leftouterjoin ACT_RE_PROCDEF DEF on RES.PROC_DEF_ID_ = DEF.ID_ orderby RES.ID_ asc
和前面的 SQL 相比,后面的 SQL 少了 WHERE RES.END_TIME_ is not NULL 条件,也就是说,判断一个流程是否执行完毕,就看它的 END_TIME_ 是否为空,不为空就表示流程已经执行结束了,为空就表示流程尚在执行中。
select RES.*, DEF.KEY_ as PROC_DEF_KEY_, DEF.NAME_ as PROC_DEF_NAME_, DEF.VERSION_ as PROC_DEF_VERSION_, DEF.DEPLOYMENT_ID_ as DEPLOYMENT_ID_ from ACT_HI_PROCINST RES leftouterjoin ACT_RE_PROCDEF DEF on RES.PROC_DEF_ID_ = DEF.ID_ where PROC_INST_ID_ = ?
接下来我写了三个 include,每一个 include 都对应一句 SQL:
includeActivities 对应的 SQL 如下:
1
SELECT RES.*from ACT_HI_ACTINST RES WHERE RES.PROC_INST_ID_ = ? orderby RES.ID_ asc
includeTasks 对应的 SQL 如下:
1
SELECT RES.*from ACT_HI_TASKINST RES WHERE RES.PROC_INST_ID_ = ? orderby RES.ID_ asc
includeVariables 对应的 SQL 如下:
1
SELECT RES.*from ACT_HI_VARINST RES WHERE RES.PROC_INST_ID_ = ? orderby RES.ID_ asc
select*from ACT_HI_IDENTITYLINK where TASK_ID_ = ?
和前面的相比,其实就多了一个查询条件 TASK_ID_。
7. 自定义查询 SQL
和前面讲的很多查询类似,当我们弄懂了每一个历史查询的 API 操作的是哪一个数据表,就会发现,历史数据的查询,也可以自定义 SQL。
举个例子和小伙伴们看下,例如查询某一个流程已经执行完毕的历史任务:
1 2 3 4 5 6 7 8 9 10 11 12
@Test voidtest13() { List<HistoricProcessInstance> instanceList = historyService.createHistoricProcessInstanceQuery().list(); for (HistoricProcessInstance hpi : instanceList) { List<HistoricTaskInstance> list = historyService.createNativeHistoricTaskInstanceQuery() .sql("SELECT RES.* from ACT_HI_TASKINST RES WHERE RES.PROC_INST_ID_ = #{pid} and RES.END_TIME_ is not null order by RES.ID_ asc") .parameter("pid",hpi.getId()).list(); for (HistoricTaskInstance hti : list) { logger.info("name:{},assignee:{},createTime:{},endTime:{}", hti.getName(), hti.getAssignee(), hti.getCreateTime(), hti.getEndTime()); } } }