學習資料:《Activiti實戰》
第十三章 流量數據查詢與跟蹤
本章講解運行時與歷史數據的查詢方法。主要包含三種:標准查詢,Native查詢,CustomSql查詢。
13.1 Query API
Activiti的查詢API分為:
1 標准查詢
以Java對象的方式,創建一個指定類型的Query對象,然后鏈式編程查詢。
缺點:不支持復雜的查詢。
2 Nativit查詢
采用標准SQL的方式查詢,因此支持復雜的查詢。
缺點:僅支持部分對象的查詢。
(1)Query接口與NativeQuery
Query接口:
1 (I)Query<...> 2 asc() T 3 desc() T 4 count() long 5 singleResult() U 6 list() List<U> 7 listPage(int,int) List<U>
NativeQuery接口(可以看到與Query無區別):
1 (I)NativeQuery<...> 2 asc() T 3 desc() T 4 count() long 5 singleResult() U 6 list() List<U> 7 listPage(int,int) List<U>
Query接口的子接口:
1 UserQuery 2 GroupQuery 3 4 JobQuery 5 ProcessDefinitionQuery 6 DeploymentQuery 7 ModelQuery 8 TaskQuery 9 ExecutionQuery 10 ProcessInstanceQuery 11 12 HistroricProcessInstanceQuery 13 HistroricTaskInstanceQuery 14 HistroricActivityInstanceQuery 15 HistroricDetailQuery 16 HistroricVariableInstanceQuery
NativeQuery接口的子接口(正如前面所說,NativeQuery只支持部分流程對象):
1 UserQuery 2 GroupQuery 3 4 JobQuery 5 ProcessDefinitionQuery 6 DeploymentQuery 7 ModelQuery 8 NativeTaskQuery 9 NativeExecutionQuery 10 NativeProcessInstanceQuery 11 12 NativeHistroricProcessInstanceQuery 13 NativeHistroricTaskInstanceQuery 14 NativeHistroricActivityInstanceQuery 15 HistroricDetailQuery 16 HistroricVariableInstanceQuery
(2)使用xxxService創建查詢
運行時與歷史數據涉及到的Service有:RuntimeService,TaskService,HistoryService。
這里以TaskService為例:
1 (I)TaskService 2 createTaskQuery() TaskQuery 3 createNativeTaskQuery() NativeTaskQuery
13.2 運行時數據查詢
運行時涉及到的Service是:RuntimeService,TaskService。
(1)流程對象對應的數據庫表
Activiti提供了通過流程對象獲取對應表名的接口,比如:
1 String tableName = managementService.getTableName(Task.Class) //此時返回的tableName = "ACT_RU_TASK"
下面列出流程對象對應的數據庫表名。
類名 | 表名 |
**.task.Task | ACT_RU_TASK |
**.runtime.Job | ACT_RU_JOB |
**.runtime.Execution | ACT_RU_EXECUTION |
**.runtime.ProcessInstance | ACT_RU_EXECUTION |
**.repository.ProcessDefinition | ACT_RE_PROCDEF |
**.repository.Deployment | ACT_RE_DEPLOYMENT |
**.history.HistoricProcessInstance | ACT_HI_PROCINST |
**.history.HistoricActivityInstance | ACT_HI_ACTINST |
**.history.HistoricDetail | ACT_HI_DETAIL |
**.history.HistoricVariableUpdate | ACT_HI_DETAIL |
**.history.HistoricFormProperty | ACT_HI_DETAIL |
**.history.HistoricTaskInstance | ACT_HI_TASKINST |
**.history.HistoricVariableInstance | ACT_HI_VARINST |
(2)任務查詢
任務查詢的時候,一般都需要滿足分頁查詢的要求。所以標准查詢無法做到,采用Native查詢。從前面的接口介紹中可以看出,NativeTaskQuery是有的。
1 List<Task> tasks = taskService.createNativeTaskQuery() 2 .sql("SELECT * FROM ACT_RU_TASK T WHERE T.NAME_ = #{taskName}" ) //此處的表明也可通過managementService.getTableName(Task.Class)獲得 3 .parameter("taskName","人事審批") 4 .listPage();//使用list()則不分頁
如果不需要分頁,采用標准查詢也可以完成task的查詢功能。
如果要條件查詢,只需要修改sql語句,把 = 換做 like 即可。
(2)查詢參與的流程
需求:查詢已經辦理過的流程,以及跟蹤流程的辦理情況。
使用標准查詢:
1 //第9章時已經介紹過ProcessInstance與Execution的關系為一對多 2 List<ProcessInstance> processInstanceList = runtimeService.createProcessInstanceQuery().list(); 3 4 List<Execution> executionList = runtimeService.createExecutionQuery().list();
但是ProcessInstanceQuery與ExecutionQuery均沒有提供"查詢某個用戶相關的流程"這個接口。所以這時需要用到Native查詢。
native查詢的用法前面已經講過。sql語句如下:
1 --用於native查詢的sql語句 2 SELECT RES.* FROM ACT_RU_EXECUTION RES 3 LEFT JOIN ACT_HI_TASKINST ART 4 ON ART.PROC_INST_ID_ = RES.PROC_INST_ID_ 5 WHERE ART.ASSIGNEE_ = #{userId} 6 AND ACT_ID_ IS NOT NULL 7 AND IS_ACTIVE_ = 'TRUE' 8 ORDER BY START_TIME_ DESC