{"record":{"id":"b84e4e5dc62a6409","repo":"flowable/flowable-engine","slug":"invalid-query-usage-cannot-set-both-candidategrou-b84e4e","errorCode":null,"errorMessage":"Invalid query usage: cannot set both candidateGroupIn and candidateGroup","messagePattern":"Invalid query usage: cannot set both candidateGroupIn and candidateGroup","errorType":"exception","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-task-service/src/main/java/org/flowable/task/service/impl/TaskQueryImpl.java","lineNumber":668,"sourceCode":"            this.bothCandidateAndAssigned = true;\n            this.userIdForCandidateAndAssignee = userIdForCandidateAndAssignee;\n        }\n\n        return this;\n    }\n\n    @Override\n    public TaskQuery taskCandidateGroupIn(Collection<String> candidateGroups) {\n        if (candidateGroups == null) {\n            throw new FlowableIllegalArgumentException(\"Candidate group list is null\");\n        }\n\n        if (candidateGroups.isEmpty()) {\n            throw new FlowableIllegalArgumentException(\"Candidate group list is empty\");\n        }\n\n        if (candidateGroup != null) {\n            throw new FlowableIllegalArgumentException(\"Invalid query usage: cannot set both candidateGroupIn and candidateGroup\");\n        }\n\n        if (orActive) {\n            currentOrQueryObject.candidateGroups = candidateGroups;\n        } else {\n            this.candidateGroups = candidateGroups;\n        }\n        return this;\n    }\n\n    @Override\n    public TaskQuery ignoreAssigneeValue() {\n        if (orActive) {\n            currentOrQueryObject.ignoreAssigneeValue = true;\n        } else {\n            this.ignoreAssigneeValue = true;\n        }\n        return this;","sourceCodeStart":650,"sourceCodeEnd":686,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-task-service/src/main/java/org/flowable/task/service/impl/TaskQueryImpl.java#L650-L686","documentation":"TaskQueryImpl.taskCandidateGroupIn() throws this when taskCandidateGroup() has already been called (candidateGroup != null). The single-group and group-list filters are mutually exclusive; setting both makes the query ambiguous. Flowable fails fast with FlowableIllegalArgumentException instead of emitting conflicting SQL.","triggerScenarios":"Calling taskCandidateGroupIn(list) after taskCandidateGroup(\"g\") on the same query, including reused query instances or query builders that apply both filters.","commonSituations":"Merging two query-building features (single group vs multi-group); a TaskQuery field reused across requests keeping prior state; dynamic builders that always call both setters.","solutions":["Pick one filter: taskCandidateGroup() for a single group or taskCandidateGroupIn() for a list.","Use taskCandidateGroupIn(Collections.singletonList(group)) when the input may be single or multiple.","Instantiate a new TaskQuery per use instead of reusing cached instances.","Refactor the query-composition code so the two filter branches are exclusive."],"exampleFix":"// before\nquery.taskCandidateGroup(\"management\");\nquery.taskCandidateGroupIn(groups);\n// after\nif (groups != null && !groups.isEmpty()) {\n    query.taskCandidateGroupIn(groups);\n} else {\n    query.taskCandidateGroup(\"management\");\n}","handlingStrategy":"validation","validationCode":"if (useSingleGroup) {\n    query.taskCandidateGroup(group);\n} else if (groups != null && !groups.isEmpty()) {\n    query.taskCandidateGroupIn(groups);\n}","typeGuard":null,"tryCatchPattern":"try {\n    query.taskCandidateGroupIn(groups);\n} catch (FlowableIllegalArgumentException e) {\n    logger.warn(\"candidateGroup already set: {}\", e.getMessage());\n    query = taskService.createTaskQuery();\n}","preventionTips":["Apply only one of taskCandidateGroup / taskCandidateGroupIn per query","Use singletonList for single-group inputs to standardize on the list API","Avoid reusing TaskQuery instances that may carry prior filters","Enforce exclusivity inside shared query-builder helpers"],"tags":["flowable","task-query","mutually-exclusive","candidate-group"],"backgroundTag":"mutually-exclusive-options","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}