Flowable 一些异常报错、注意事项(2)
记录一: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: 在启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)。
