試用了Activiti近期推出的5.18版本,按照User Guide初始化了工程,爲簡單起見使用了嵌入式的H2數據庫。
java
增長了單元測試:git
@Test public void testDeployAndRun() { repositoryService.createDeployment().addClasspathResource("def/a.bpmn").deploy(); repositoryService.createProcessDefinitionQuery().singleResult(); // repositoryService.createProcessDefinitionQuery().processDefinitionKey("a").orderByDeploymentId().asc().singleResult(); runtimeService.startProcessInstanceByKey("a"); logger.debug("Number of process instances: " + runtimeService.createProcessInstanceQuery().count()); // List<Task> tasks = taskService.createTaskQuery().list(); // assertNotNull(tasks); // assertTrue(tasks.size() > 0); }
結果執行到:github
repositoryService.createProcessDefinitionQuery().singleResult();
運行報錯:數據庫
org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.h2.jdbc.JdbcSQLException: Syntax error in SQL statement "SELECT RES.* FROM ACT_RE_PROCDEF RES ORDER BY ORDER[*] BY RES.ID_ ASC LIMIT ? OFFSET ? "; expected "=, NOT, EXISTS, INTERSECTS, SELECT, FROM"; SQL statement: select RES.* from ACT_RE_PROCDEF RES order by order by RES.ID_ asc LIMIT ? OFFSET ? [42001-176]
其中order by部分出現兩次。apache
增長orderByDeploymentId().asc()方法調用仍然是一樣的錯誤。maven
越過repositoryService的查詢,啓動流程後,查詢Task時也是相似的錯誤。即部署、啓動等操做正常執行了,但查詢類操做失敗。ide
跟蹤了一下Activiti的源代碼,實際執行的MyBatis語句以下(ProcessDefinition.xml):
單元測試
<select id="selectProcessDefinitionsByQueryCriteria" parameterType="org.activiti.engine.impl.ProcessDefinitionQueryImpl" resultMap="processDefinitionResultMap"> ${limitBefore} select RES.* ${limitBetween} <include refid="selectProcessDefinitionsByQueryCriteriaSql"/> ${orderBy} ${limitAfter} </select>
代碼中有一處orderBy的變量,具體賦值不知道哪裏處理的,對於出現的問題有些不解。測試
網上搜索了一下,發現github上的一個帖子:ui
https://github.com/Activiti/Activiti/issues/597
問題描述相一致。問題在於使用了MyBatis 3.3.0版本。Activiti 5.18自身聲明的MyBatis版本是3.2.5. 帖子的最後,Activiti的人員回覆「Because Activiti currently does not work with MyBatis 3.3.x.」。
將maven聲明的MyBatis版本修改成3.2.5,測試經過。
不知道MyBatis 3.3.0和3.2.5有何不一樣?