标签:

我们使用工作流引擎,一个非常重要的功能就是获取待办事项列表,在Activiti中,我们可以通过TaskService的相关API进行查询,这些API设计优雅,但是实际使用中往往不够方便,也缺乏灵活性,达不到技术解决方案的要求,主要有如下几个问题:

1.多数情况无法通过调用一个API满足需求,这时一个现实问题就是需要对结果集进行合并然后排序,这样就显得比较麻烦;

2.和项目业务表关联困难;

3.Activiti中相关查询返回的是Activiti定义的实体,这些实体包含的信息可能不够;

4.Activiti中的实体,可能和项目中的对象关系映射(ORM)冲突;

鉴于上述原因,在一些大规模的项目中,Activiti提供的查询API,实际使用价值不大,我们需要另外寻找解决方案。在Activiti的查询API中,也提供原始SQL的查询接口,但是大量使用后,会发现代码不够优雅,维护困难。这个问题其实从开发者角度,查询时用用户的id,用最简单的SQL查询出来所有想要的信息是最理想的。

分析上述缺点和需求后,我们认为通过API方式进行查询的话,总是有各种缺陷,因此把目标放在数据库上,如果能通过定义视图的方式解决问题,那么将彻底解决查询的方便性、灵活性、通用性问题。

经过分析Activiti的数据库表,我们发现并不复杂,和待办事项有关系的表,包括ACT_RU_TASK、ACT_RU_IDENTITYLINK,ACT_RU_TASK中存储了任务相关信息,ACT_RU_IDENTITYLINK中存储了候选组和候选人信息,这里面一个比较重要的问题就是,Activiti中的候选组、候选人如何跟系统中的用户、组织、角色对应的问题,本文提供的解决方案,假定系统中有一张名为SYS_ROLE_USER的表,该表中存储了角色和用户的对应关系,并且Activiti中的候选组和角色是同一个概念,开发者的系统中具体是什么情况,需要开发者举一反三,本文仅提供一个设计思路。

在Activiti中,对于一个节点,可分为受托人,候选人和候选组三种情况,后两种可以设置多个,用逗号分隔,对应到数据库中,会被拆分为ACT_RU_IDENTITYLINK的多条记录,这些我们都需要考虑,细节上可以通过UNION实现,下面是样例代码,该代码基于Oracle数据库,其他数据库的版本,稍后会说明。

CREATE VIEW V_TASKLIST AS

SELECT A.ID_ AS TASK_ID,

A.PROC_INST_ID_ PROC_INST_ID,

A.TASK_DEF_KEY_ AS ACT_ID,

A.NAME_ AS ACT_NAME,

A.ASSIGNEE_ AS ASSIGNEE,

A.DELEGATION_ AS DELEGATION_ID,

A.DESCRIPTION_ AS DESCRIPTION,

TO_CHAR(A.CREATE_TIME_, ‘YYYY-MM-DD HH24:MI:SS‘) AS CREATE_TIME,

TO_CHAR(A.DUE_DATE_,‘YYYY-MM-DD HH24:MI:SS‘) AS DUE_DATE,

I.USER_ID CANDIDATE

FROM ACT_RU_TASK A

LEFT JOIN (SELECT DISTINCT * FROM (SELECT TASK_ID_, TO_CHAR(USER_ID_) USER_ID

FROM ACT_RU_IDENTITYLINK I, ACT_RU_TASK T

WHERE TASK_ID_ IS NOT NULL

AND USER_ID_ IS NOT NULL

AND I.TASK_ID_ = T.ID_

AND T.ASSIGNEE_ IS NULL

AND TYPE_ = ‘candidate‘

UNION

SELECT TASK_ID_, R.USER_ID

FROM ACT_RU_IDENTITYLINK I,SYS_ROLE_USER R,ACT_RU_TASK T

WHERE I.TASK_ID_ IS NOT NULL

AND I.GROUP_ID_ IS NOT NULL

AND I.TASK_ID_ = T.ID_

AND T.ASSIGNEE_ IS NULL

AND TYPE_ = ‘candidate‘

AND I.GROUP_ID_ = R.ROLE_ID)U) I--候选组和业务上的角色用户表关联

ON A.ID_ = I.TASK_ID_

这个视图比较简单,主要查询了任务信息,如果还需要其他信息,比如和流程实例、流程定义等,可以自行增加其他的表关联,比如要和业务表关联需要一个很重要的字段就是BUSINESS_KEY_,这个和ACT_RU_EXECUTION表关联即可。

这个视图定义好之后,代办查询可以用如下的更简洁的SQL实现:

SELECT * FROM V_TASKLIST WHERE ASSIGNEE = :userId OR CANDIDATE = :userId

这样的话,和业务表关联也非常的方便,也不会受到API的限制,也不涉及和系统的ORM兼容的问题,基本上想查询什么信息就能用一个简单的SQL查询到什么信息,基本可以作为一个通用的解决方案了。

上述例子仅提供了Oracle的代码,对于兼容多数据库的设计,比较麻烦,各种数据库都对视图的创建做了较多的限制,比如SQLServer不能在SQL中写ORDER BY,MySQL中FROM字句不能嵌套子查询,以及不同数据库字段类型定义不同等,在我们的解决方案中,基本上就是把上述SQL做了拆分,定义了若干非常小的视图,然后V_TASKLIST视图再查询这些视图。具体上开发者可以灵活处理,本文不再展开。

标签:

mysql待办事项表名_Activiti中彻底解决待办事项列表查询复杂、API不友好的设计方案...相关推荐

  1. mysql待办事项表名_SSD8-Ex4待办事项列表答案参考

    [实例简介] SSD8-Ex4待办事项列表答案参考:http://wangbaiyuan.cn/mysql-database-data-released-in-java-web-service-and ...

  2. mysql修改database名_MySQL中修改database的名字

    背景案例:MySQL中已经存在base的database,处于某种原因需要改为改为gzbase.步骤如下: 1.首先创建目标数据库: mysql>create database gzbase; ...

  3. Mysql在可视化工具navicat中如何解决输入小数变整数的问题,(改变小数位数)

    方法一 1.点击你选中的表,单击设计表 2.单击字段名,将类型改为double,小数点改为你想保留的几位小数,最后再保存 注:上图中的"填充0"可勾选,若选中,有一个数字输入的时候 ...

  4. mysql在可视化软件navicat中如何解决中文乱码问题

    报错情况 https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) sql语 ...

  5. jpa遇到mysql表名大写怎么办_解决(springboot项目)mysql表名大写,造成jpa Table doesn't exist问题...

    一般实体类中的属性, 如contentType会被hibernate默认映射为content_type,如果数据库中的字段是contenttype则会不匹配 这个问题有2种解决方法: 我的报错是: j ...

  6. jsp项目中连接数据库解决java.lang.ClassNotFoundException: com.mysql.jdbc.Driver的问题

    jsp项目中连接数据库解决java.lang.ClassNotFoundException: com.mysql.jdbc.Driver的问题 参考文章: (1)jsp项目中连接数据库解决java.l ...

  7. % mysql 代表_MySQL中的星号(*)和百分号(%)代表表示什么,MySQL的库名、表名、字段名、字段值是否区分大...

    1.MySQL中的星号(*)和百分号(%)代表表示什么 星号(*):表示全部的意思. select * from table_name;(查询表table_name中所有的数据) 百分号(%):表示通 ...

  8. MySQL数据库在众多表中对表名的查询及预处理存储过程(变量做表名)

    以下的文章主要介绍的是MySQL数据库在众多表中进行表名与字段名的查询的实际操作步骤,以及对实现其查询所要用到的SQL 语句的介绍,还有两个实际解决方案的描述,以下就是文章的主要内容描述. 在MySQ ...

  9. wdcp mysql数据库无法链接_MySQL数据库之阿里云服务器中centos7 解决wdcp中不能远程访问mysql服务的问题...

    本文主要向大家介绍了MySQL数据库之阿里云服务器中centos7 解决wdcp中不能远程访问mysql服务的问题 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 1.检查mys ...

最新文章

  1. 如何挑选一家好的软件测试培训机构
  2. 心得丨8个深度学习方面的最佳实践
  3. hdu3068 . 最长回文
  4. yoast造成php内存,php – Yoast SEO |如何创建自定义变量
  5. 打开windows 10系统语言设置的快捷方式
  6. go build不从本地gopath获取_跟我一起学习go语言,包依赖管理工具go mod
  7. 微软用的工具,统一财务三大表及高级分析通用模板
  8. 绝对不忽悠、暑期择机功能该咋选?
  9. Mac上的抓包工具Charles
  10. Nginx + Tomcat Windows下的负载均衡配置
  11. PPT绘图保存为PDF的三种方式
  12. mvc razor html.list,NetCore Web应用开发-HTML,C#,Razor补充
  13. java 通过 Properties类 读取ini文件 键—值对
  14. Unity移动端使用 Handheld.PlayFullScreenMovie播放视频参数
  15. 知识图谱——TransE模型原理
  16. 开普勒方程迭代求解C语言,一种实用的开普勒方程求解方法及其 C 语言实现
  17. torch.kron()函数
  18. 软著申请材料,软著申请文件,软著登记材料,软著登记文件
  19. ABAC权限模型的设计
  20. 华为开发者联盟申请鸿蒙开发者Beta版,华为面向开发者发布鸿蒙技术测试版

热门文章

  1. JAVA逆向反混淆-追查Burpsuite的破解原理
  2. 玩转Redis集群(下)
  3. C# MVC 自定义ActionResult实现EXCEL下载
  4. opengl启动过程
  5. (转) Android平台上关于IM的实践总结
  6. Jackson将json字符串转换成泛型List
  7. shell:判断一个进程是否存在
  8. 选防晒霜 要看四个要点 - 健康程序员,至尚生活!
  9. 金笛邮件中使用wap邮箱
  10. 可能是最强大的【CSS】动画库