Activiti流程 关于自定义sql查询

由于才接触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。

posted on 2016-07-08 11:00  杨_静  阅读(11277)  评论(0编辑  收藏  举报

导航