org.activiti.engine.ActivitiException: Query return 2 results instead of max 1

使用若依Activiti工作流发起请假申请单时,提示Query return 2 results instead of max 1。原因是pom.xml中配置的版本为7.1.0.M6,解决方法是将版本改为7.1.0.M4。

问题描述:在使用若依activit工作流,发起请假申请单时,提示org.activiti.engine.ActivitiException: Query return 2results instead of max 1

出现原因:pom.xml中配置的7.1.0.M6
解决方法:将版本改为7.1.0.M4
在这里插入图片描述

在使用 Activiti 工作流引擎时,若出现 `org.activiti.engine.ActivitiException: Query returned 16 results instead of max 1` 异常,表示某个本应返回单条结果的查询意外地返回了多条记录(例如 16 条),这通常发生在流程实例、任务或执行的唯一性查询中。 此类异常常见于以下几种场景: - 查询流程定义时使用了 `processDefinitionKey` 和 `latest()`,但存在多个同名流程定义版本。 - 查询任务时使用了 `taskId()`、`processInstanceId()` 等唯一性标识,但数据库中存在多个匹配记录。 - 数据库中存在脏数据,例如重复的流程实例 ID 或任务 ID。 - 查询条件不充分,导致查询结果不唯一。 ### 修复建议 #### 1. 检查流程定义版本 如果查询使用了 `latest()` 方法获取最新版本的流程定义,请确认是否确实只存在一个最新版本。可以使用如下代码检查: ```java List<ProcessDefinition> definitions = repositoryService.createProcessDefinitionQuery() .processDefinitionKey("yourProcessKey") .latestVersion() .list(); ``` 若返回结果大于 1,则说明存在多个“最新版本”流程定义,这可能是由于流程部署时未正确设置版本策略所致。 #### 2. 明确指定唯一标识符 确保在执行单条查询时使用了足够精确的唯一标识符,例如: ```java Task task = taskService.createTaskQuery() .taskId("specificTaskId") .singleResult(); ``` 如果 `taskId` 存在多个匹配项,说明数据库中存在重复的任务 ID,应检查任务生成逻辑或数据库完整性约束。 #### 3. 检查数据库一致性 使用以下 SQL 查询 Activiti 数据库中的 `ACT_RU_TASK` 表,查看是否存在重复的任务记录: ```sql SELECT TASK_ID_, count(*) FROM ACT_RU_TASK GROUP BY TASK_ID_ HAVING count(*) > 1; ``` 类似地,可检查 `ACT_RU_EXECUTION` 或 `ACT_RU_IDENTITYLINK` 中是否存在重复数据。若存在脏数据,需根据业务逻辑进行清理或归档。 #### 4. 使用 `singleResult()` 和 `list()` 的注意事项 Activiti 的查询接口中,`singleResult()` 要求结果唯一且存在,否则抛出异常;而 `list()` 返回所有匹配结果。若不确定结果唯一性,应先使用 `list()` 获取结果集,再进行判断: ```java List<Task> tasks = taskService.createTaskQuery() .processInstanceId("someInstanceId") .list(); if (tasks.size() == 1) { Task task = tasks.get(0); } else { // 处理非唯一结果的情况 } ``` #### 5. 配置查询限制 在某些情况下,可以通过设置查询限制来避免异常,例如: ```java Task task = taskService.createTaskQuery() .processInstanceId("someInstanceId") .maxResults(1) .singleResult(); ``` 但这种方式并不推荐用于需要唯一性保证的场景,因为可能掩盖数据问题。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

A smirK squirrel

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值