记录一:NativeTaskQuery
Flowable 中的查询有两种方式:查询API和原生(Native)查询
查询API例如:
taskService.createTaskQuery() .taskAssignee("aaa")
原生查询例如:
taskService.createNativeTaskQuery() .sql()
如果一开始对原生查询的sql怎么写不好把握,可以通过查询API的方式内部运行的sql,来改写或者组装。
例如通过下面查询历史任务记录的方法报错中提示的sql,来梳理查询历史记录所涉及的表关系
### The error may involve org.flowable.task.service.impl.persistence.entity.HistoricTaskInstanceEntityImpl.selectHistoricTaskInstancesByQueryCriteria-Inline
### The error occurred while setting parameters
### SQL: SELECT RES.* from ACT_HI_TASKINST RES WHERE RES.ASSIGNEE_ = ? and RES.ASSIGNEE_ is null and EXISTS(select LINK.ID_ from ACT_HI_IDENTITYLINK LINK where LINK.TYPE_ = 'candidate' and LINK.TASK_ID_ = RES.ID_ and ( LINK.USER_ID_ = ? ) ) and order by RES.START_TIME_ desc
### Cause: java.sql.SQLSyntaxErrorE
经过梳理,自己组装成原生查询所使用的sql可以是这样:
SELECT
RES.*
FROM
ACT_HI_TASKINST RES
WHERE
RES.ASSIGNEE_ = '1'
OR (
RES.ASSIGNEE_ IS NULL
AND EXISTS (
SELECT
LINK.ID_
FROM
ACT_HI_IDENTITYLINK LINK
WHERE
LINK.TYPE_ = 'candidate'
AND LINK.TASK_ID_ = RES.ID_
AND ( LINK.USER_ID_ = '1' )
)
)
ORDER BY
RES.START_TIME_ DESC
记录二:用户任务UserTask中自定义元素的数据结构
记录三:修改ACT_RU_VARIABLE表字段的长度限制
运行过程中一些变量存入了运行时变量表,变量对应的值在表中的字段是TEXT_,varchar(4000)
源码中的建表语句是:
create table ACT_RU_VARIABLE (
ID_ varchar(64) not null,
REV_ integer,
TYPE_ varchar(255) not null,
NAME_ varchar(255) not null,
EXECUTION_ID_ varchar(64),
PROC_INST_ID_ varchar(64),
TASK_ID_ varchar(64),
SCOPE_ID_ varchar(255),
SUB_SCOPE_ID_ varchar(255),
SCOPE_TYPE_ varchar(255),
BYTEARRAY_ID_ varchar(64),
DOUBLE_ double,
LONG_ bigint,
TEXT_ varchar(4000),
TEXT2_ varchar(4000),
primary key (ID_)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_bin;
如果变量对应的值可能会超过4000,字段需要长度扩大点,可以用sql命令修改字段长度:
alter table act_ru_variable modify column TEXT_ varchar(8000) ;
alter table act_hi_varinst modify column TEXT_ varchar(8000) ;
不影响整体代码运行。
记录四:备记flowable数据库更新策略
database-schema-update
flase: 默认值。在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常。(生产环境常用)
true: 会对数据库中所有表进行更新操作。如果表不存在,则自动创建。(开发时常用)
create_drop: 在启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)。(单元测试常用)
drop-create: 在启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)。