flowable 如何自定义sql

场景: 在实际项目中,有可能你会自己写一些sql,但是你又不想写过多的dao,service xml的时候,我们可以利用flowable自身的自定义sql实现

实现这一场景,我们一般有两种方式。

1、配置xml的形式

1.1、编写xml文件

1.2、配置config

<property name="customMybatisXMLMappers">
        <set>
            <value>org/flowable/standalone/cfg/custom-mappers/CustomTaskMapper.xml</value>
        </set>
    </property>

1.3、执行查询操作

CustomTask customTask = managementService.executeCommand(new Command<CustomTask>() {
            @Override
            public CustomTask execute(CommandContext commandContext) {
                return (CustomTask) CommandContextUtil.getDbSqlSession(commandContext).selectOne("selectOneCustomTask", taskId);
            }
        });

2、注解的方式

2.1、配置查询接口注解

public interface MyTestMapper {

    @Select("SELECT ID_ as id, NAME_ as name, CREATE_TIME_ as createTime FROM ACT_RU_TASK")
    List<Map<String, Object>> selectTasks();

    @Select({ "SELECT task.ID_ as taskId, variable.LONG_ as variableValue FROM ACT_RU_VARIABLE variable", "inner join ACT_RU_TASK task on variable.TASK_ID_ = task.ID_",
            "where variable.NAME_ = #{variableName}" })
    List<Map<String, Object>> selectTaskWithSpecificVariable(String variableName);

}

2.2、配置config

<property name="customMybatisMappers">
        <set>
            <value>org.flowable.standalone.cfg.MyTestMapper</value>
        </set>
    </property>

2.3、执行sql

// Fetch the columns we're interested in
        CustomSqlExecution<MyTestMapper, List<Map<String, Object>>> customSqlExecution = new AbstractCustomSqlExecution<MyTestMapper, List<Map<String, Object>>>(MyTestMapper.class) {

            @Override
            public List<Map<String, Object>> execute(MyTestMapper customMapper) {
                return customMapper.selectTasks();
            }
        };

        // Verify
        List<Map<String, Object>> tasks = managementService.executeCustomSql(customSqlExecution);
本课程是《Flowable流程入门课程》的后续高级课程。在学习本课程前,应先学习入门课程,以掌握相关基础知识。高级课程着重讲解Flowable工作流的高级概念、复杂理论和实战应用。课程内容包括流程管理思想、技术与标准、工作流的控制模式和资源模式;Flowable数据库表及变量;与Spring、Spring Boot的集成;BPMN 2.0主要类图;Flowable高级服务如JAVA服务任务、脚本任务、Web Service任务、外部工作者任务、多实例任务、补偿处理程序、子流程和调用活动等;Flowable事件侦听器、执行侦听器和任务侦听器;Flowable历史和REST API;Flowable事务、并发性、身份管理及LDAP集成;Flowable高级主题如流程实例迁移、异步执行器的设计与配置、用于高并发的UUID ID生成器、多租户、高级流程引擎配置、执行自定义SQL和实验性流程调试器等;Flowable Eclipse设计器特性及定制;Flowable 事件注册;Flowable相关标准和规范如ISO8601标准和cron等。本课程对Flowable官方文档进行了彻底梳理和融汇贯通,并结合实践,形象生动、系统全面、简单易懂地呈现给大家,让大家从开源软件文档冗长耗时、英文晦涩难懂、概念理解困难、知识点分散等困境中解脱出来,从而能快速地将Flowable具有的高级特性应用到项目的高级需求和复杂实践中去。课程特色:案例和代码驱动、基础概念与经典实战相结合、知识环节融会贯通、关联知识平滑拓展、概念和原理展示形象生动。
### 使用Flowable替代SQL进行查询操作 在业务流程管理(BPM)环境中,Flowable作为一个强大的工作流引擎提供了多种方式来管理和查询数据,而不仅仅依赖于传统的SQL语句。通过利用Flowable的API以及其内置的服务层功能,可以实现复杂的数据检索需求。 #### 利用Flowable的历史服务执行高级查询 对于历史记录的操作,比如查找已完成的任务或已结束的过程实例,可以通过`HistoryService`来进行高效的查询而不必编写复杂的SQL脚本。下面是一个简单的例子展示如何根据特定条件获取已经完成的任务列表: ```java // 获取 History Service 实例 HistoryService historyService = processEngine.getHistoryService(); // 创建并配置查询对象 HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery() .taskAssignee("john.doe") // 只返回分配给 john.doe 的任务 .finished() // 过滤掉未完成的任务 .orderByTaskCreateTime().asc(); // 按创建时间升序排列 // 执行查询并将结果存储到 List 中 List<HistoricTaskInstance> tasks = taskQuery.list(); ``` 这段代码展示了如何使用Flowable提供的`HistoricTaskInstanceQuery`类代替直接写入数据库查询逻辑[^1]。 #### 动态构建查询条件 除了预设的方法外,还可以动态设置更多筛选参数以满足不同的应用场景。例如,在某些情况下可能需要联合多个属性作为过滤依据;这时就可以借助Fluent接口风格轻松组合各种约束条件。 ```java // 构建更复杂的查询表达式 HistoricProcessInstanceQuery piQuery = historyService.createHistoricProcessInstanceQuery() .processDefinitionKey("invoice-process") .startedAfter(startDate) .endedBefore(endDate); if (userId != null && !userId.isEmpty()) { piQuery.starterUserId(userId); } long count = piQuery.count(); // 统计符合条件的结果数量 ``` 此片段说明了怎样灵活调整查询范围,并且支持分页等功能[^2]。 #### 自定义查询扩展 当默认提供的查询能力无法完全覆盖实际需求时,开发人员可以选择继承相应的抽象类或者实现接口来自定义新的查询组件。这种方式允许深入定制化处理机制,从而更好地适应特殊场景下的高效查询要求。 需要注意的是,虽然上述方法可以在很大程度上减少甚至消除对原生SQL的需求,但在涉及到非常规的数据访问模式或是性能敏感型应用时,仍然建议评估是否有必要保留部分传统关系型数据库层面的操作[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小学生05101

flowable

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值