一.简介
建议在 Spring Boot 的 application.properties 中添加如下配置,开启 flowable 日志:
logging.level.org.flowable=debug
这个配置表示开启 flowable 的日志,开启日志的好处是可以看到底层的 SQL语句。
二.查询部署信息
例如查询流程的部署信息,代码如下:
@Test
void test01() throws IOException {
List<Deployment> list = repositoryService.createDeploymentQuery().list();
for (Deployment deployment : list) {
logger.info("id:{};key:{}", deployment.getId(), deployment.getKey());
}
}
创建一个查询器,然后返回所有的流程部署信息并打印出来,此时看下 IDEA 控制台打印出来的 SQL 信息:
可以看到,底层执行的 SQL 其实就是去查询 ACT_RE_DEPLOYMENT 表。
从上图中可以看到,利用流程部署的名字、分类、ID 等各种信息去查询,可以精确匹配也可以模糊匹配。
例如:查询 key 为 javaboy的工作流key 的流程部署文件,但是这个流程我之前部署过多次(版本升级),现在我想查询最近一次的流程部署信息,代码如下:
@Test
void test01() throws IOException {
Deployment deployment = repositoryService.createDeploymentQuery().deploymentKey("javaboy的工作流key").latest().singleResult();
logger.info("id:{};key:{}", deployment.getId(), deployment.getKey());
}
看下控制台打印出来的 SQL:
--- [ main] i.p.e.D.selectDeploymentsByQueryCriteria : ==> Preparing: SELECT RES.* from ACT_RE_DEPLOYMENT RES WHERE RES.KEY_ = ? and RES.DEPLOY_TIME_ = (select max(DEPLOY_TIME_) from ACT_RE_DEPLOYMENT where KEY_ = RES.KEY_ and DERIVED_FROM_ is null and ( (TENANT_ID_ IS NOT NULL and TENANT_ID_ = RES.TENANT_ID_) or (TENANT_ID_ IS NULL and RES.TENANT_ID_ IS NULL) ) ) order by RES.ID_ asc
--- [ main] i.p.e.D.selectDeploymentsByQueryCriteria : ==> Parameters: javaboy的工作流key(String)
--- [ main] i.p.e.D.selectDeploymentsByQueryCriteria : <== Total: 1
这个 SQL 写的有点复杂,但是仔细看就一个意思,给定查询的 key 是 javaboy的工作流key,查询时间是一个最大的时间,这就很好懂了。
三.查询流程定义信息
查询所有的流程定义信息,代码如下:
@Test
void test02() {
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
for (ProcessDefinition pd : list) {
logger.info("id:{};key:{};version:{};",pd.getId(),pd.getKey(),pd.getVersion());
}
}
看下控制台打印的 SQL:
可以看到,就是去流程定义表 ACT_RE_PROCDEF 去查看所有。
基于此,其他的查询 API 就都好理解了,例如:根据流程定义的 KEY 去查询所有的流程定义,这个 KEY 其实就是流程定义 XML 文件中的 id:
@Test
void test02() {
List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().processDefinitionKey("javaboy_submit_an_expense_account").list();
for (ProcessDefinition pd : list) {
logger.info("id:{};key:{};version:{};",pd.getId(),pd.getKey(),pd.getVersion());
}
}
看下控制台打印的 SQL:
其他的查询 API 也是类似的。
四.原生查询
我们也可以自己写 SQL 查询。
跟前面一样,例如我想查询 key 为 javaboy的工作流key 的流程部署文件,但是这个流程我之前部署过多次(版本升级),现在我想查询最近一次的流程部署信息,查询代码如下:
@Test
void test03() {
Deployment deployment = repositoryService.createNativeDeploymentQuery().sql("SELECT RES.* from ACT_RE_DEPLOYMENT RES WHERE RES.KEY_ = #{key} and RES.DEPLOY_TIME_ = (select max(DEPLOY_TIME_) from ACT_RE_DEPLOYMENT where KEY_ = RES.KEY_) order by RES.ID_ asc").parameter("key", "javaboy的工作流key").singleResult();
logger.info("id:{};key:{}", deployment.getId(), deployment.getKey());
}
``
自己写 SQL 即可,参数的占位符用 #,因为这里底层的 SQL 操作实际上是 MyBatis。
相同的道理,我想根据流程定义的 KEY 去查询流程定义信息,使用原生查询方式,代码如下:
@Test
void test04() {
List list = repositoryService.createNativeProcessDefinitionQuery()
.sql(“SELECT RES.* from ACT_RE_PROCDEF RES WHERE RES.KEY_ = #{key} order by RES.ID_ asc”)
.parameter(“key”, “javaboy_submit_an_expense_account”).list();
for (ProcessDefinition pd : list) {
logger.info(“id:{};key:{};version:{};”, pd.getId(), pd.getKey(), pd.getVersion());
}
}