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: 在启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)。

经验分享 程序员 微信小程序 职场和发展