由於才接觸Activiti不久,對於表結構也不熟悉,甚至可以說連那些表對應的實體類都搞不清楚,又不能通過Activiti自帶的鏈式查詢實現;在這種情況下跟不知道怎麼通過sql去實現自己想要的查詢。上網看了些別人關於Activiti的介紹也不是很多,有的時候在自己模稜兩可情況下看了別人的資料更不知道該怎麼做了。
例如:我現在需要做個流程的已辦事項,結果activiti的人都知道,activiti會將我們正在執行的任務復制一份在歷史表中,要是這個任務完成了的話,他就會將正在執行的任務表中的數據清除使歷史任務表中的數據結束時間有值,但是如果正在執行的任務沒有完成的話,我們歷史表就會用一條數據,如果現在將這條數據展示給用戶的話,用戶的體驗就會很不好。
通常我們會使用鏈式查詢出歷史表中的所有數據:
List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery().taskAssignee(organid) .orderByHistoricActivityInstanceStartTime().desc().listPage(pagin.getStartResult(), pagin.getPageSize());
這樣查詢出來的任務列表他包含了結束時間為空的數據,直接給用戶展示的話,用戶的體驗就不好了。
如果我使用拼寫sql的形式去查詢“END_TIME_ is not null”就直接 簡單的多。但是我們該怎麼寫這個sql呢?
List<HistoricTaskInstance> tasks = historyService.createNativeHistoricTaskInstanceQuery() .sql("select * from " + managementService.getTableName(HistoricTaskInstance.class)+" H where H.END_TIME_ is not null and H.ASSIGNEE_ like #{organid} order by H.END_TIME_ desc") .parameter("organid", "%"+organid+"%") .listPage(pagin.getStartResult(), pagin.getPageSize());
代碼中標紅處:1、通過managementService接口找到我們需要使用的class類直接轉換為對應的表,這樣的話 我們不需要去知道這個實體所對應的表文件是“誰”了。
2、使用了模糊查詢,看網上別人的帖子,最開始以為activiti的模糊查詢跟其他的模糊查詢是一樣的,可是自己試了下後,總是表示拼寫的sql從在錯誤。才發現“%”拼錯地方了這個東西需要拼寫到參數這邊,而不是拼寫到sql語句中。
問題:其實在做已辦事項的時候 我遇到一個問題,雖然後面我通過歪點子解決了這個問題,但是心裡其實還是很想知道 activiti大神 或者是activiti正常的思維是怎麼解決類似的問題的。
由於我這兒的流程很多,在已辦中用於區分開不同分類的流程,使其分發走不同的業務Action;必須需要一個屬性來區分,故而將其流程的key定義為每個業務類的類名(類名不能重復);那麼問題來了,如何在歷史任務中獲得ProcessDefinitionKey
問題描述:
如果是待辦事項的話 我們可以很輕松的從ProcessInstance對象中拿到ProcessDefinitionKey(這個字段我是用的是對應流程業務類的類名),但是在已辦事項中這個字段從HistoricProcessInstance這個對象中拿不到的。不知道給位使用過activiti的同仁們是怎麼做到的。
解決方案:
我對於activiti的存放是這樣的:我在啟動流程的時候設置了流程BUSINESS_KEY(業務類的類名.業務的ID),由於我的流程的key對於的也是業務類的類名所以這兒就能偷到這個懶,當然有些人這個BUSINESS_KEY是直接存放的業務ID。