(这可能最终会出现在Activiti 5.15版本的用户指南中,但是我已经想共享它了)
Activiti API允许使用高级API与数据库进行交互。 例如,对于检索数据,查询API和本机查询API的用法很强大。 但是,对于某些用例,它们可能不够灵活。 下一节描述了如何针对Activiti数据存储区执行完全自定义的SQL语句(可以进行选择,插入,更新和删除),但是如何在已配置的Process Engine内完全执行(从而例如利用事务设置)。
为了定义自定义SQL语句,Activiti引擎利用其基础框架MyBatis的功能。 使用自定义SQL时要做的第一件事是创建MyBatis映射器类。 可以在MyBatis用户指南中信息。 例如,假设对于某些用例,不需要全部任务数据,而仅需要其中一小部分。 可以执行此操作的Mapper如下所示:
public interface MyTestMapper {@Select("SELECT ID_ as id, NAME_ as name, CREATE_TIME_ as createTime FROM ACT_RU_TASK")List<Map<String, Object>> selectTasks();}
必须将此映射器提供给Process Engine配置,如下所示:
...
<property name="customMybatisMappers"><set><value>org.activiti.standalone.cfg.MyTestMapper</value></set>
</property>
...
请注意,这是一个接口。 底层的MyBatis框架将创建一个实例,可以在运行时使用。 还要注意,该方法的返回值不是类型,而是映射列表(与具有列值的行列表相对应)。 如果需要,可以使用MyBatis映射器键入。
要执行上面的查询,必须使用managementService.executeCustomSql方法。 此方法接受一个CustomSqlExecution实例。 这是一个包装程序,它隐藏了使引擎正常工作所需的引擎内部位。
不幸的是,Java泛型使它的可读性比以前要差一些。 下面的两个泛型类型是mapper类和return类型类。 但是,实际的逻辑仅仅是调用mapper方法并返回其结果(如果适用)。
CustomSqlExecution<MyTestMapper, List<Map<String, Object>>> customSqlExecution =new AbstractCustomSqlExecution<MyTestMapper, List<Map<String, Object>>>(MyTestMapper.class) {public List<Map<String, Object>> execute(MyTestMapper customMapper) {return customMapper.selectTasks();}};List<Map<String, Object>> results = managementService.executeCustomSql(customSqlExecution);
在这种情况下,上面列表中的Map条目将仅包含ID,名称和创建时间 ,而不包含完整的任务对象。
使用上述方法时,任何SQL都是可能的。 另一个更复杂的示例:
@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);
使用此方法,任务表将与变量表结合在一起。 仅保留具有特定名称的变量,并返回任务ID和相应的数值。
这将在Activiti 5.15中实现。 但是,该代码(更具体地说是Command实现和wrapper接口 )可以在Activiti的任何较旧版本中使用。
翻译自: https://www.javacodegeeks.com/2014/01/execute-custom-queries-in-activiti.html