{"record":{"id":"fa75c94c294ec322","repo":"flowable/flowable-engine","slug":"invalid-query-usage-cannot-set-both-taskassigneei-fa75c9","errorCode":null,"errorMessage":"Invalid query usage: cannot set both taskAssigneeIds and taskAssignee","messagePattern":"Invalid query usage: cannot set both taskAssigneeIds and taskAssignee","errorType":"validation","errorClass":"ActivitiIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable5-engine/src/main/java/org/activiti/engine/impl/TaskQueryImpl.java","lineNumber":390,"sourceCode":"        return this;\n    }\n\n    @Override\n    public TaskQuery taskAssigneeIds(List<String> assigneeIds) {\n        if (assigneeIds == null) {\n            throw new ActivitiIllegalArgumentException(\"Task assignee list is null\");\n        }\n        if (assigneeIds.isEmpty()) {\n            throw new ActivitiIllegalArgumentException(\"Task assignee list is empty\");\n        }\n        for (String assignee : assigneeIds) {\n            if (assignee == null) {\n                throw new ActivitiIllegalArgumentException(\"None of the given task assignees can be null\");\n            }\n        }\n\n        if (assignee != null) {\n            throw new ActivitiIllegalArgumentException(\"Invalid query usage: cannot set both taskAssigneeIds and taskAssignee\");\n        }\n        if (assigneeLike != null) {\n            throw new ActivitiIllegalArgumentException(\"Invalid query usage: cannot set both taskAssigneeIds and taskAssigneeLike\");\n        }\n        if (assigneeLikeIgnoreCase != null) {\n            throw new ActivitiIllegalArgumentException(\"Invalid query usage: cannot set both taskAssigneeIds and taskAssigneeLikeIgnoreCase\");\n        }\n\n        if (orActive) {\n            currentOrQueryObject.assigneeIds = assigneeIds;\n        } else {\n            this.assigneeIds = assigneeIds;\n        }\n        return this;\n    }\n\n    @Override\n    public TaskQueryImpl taskOwner(String owner) {","sourceCodeStart":372,"sourceCodeEnd":408,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable5-engine/src/main/java/org/activiti/engine/impl/TaskQueryImpl.java#L372-L408","documentation":"Thrown by TaskQueryImpl.taskAssigneeIds(List<String>) when the query already has an exact assignee filter set via taskAssignee(String). Assignee filters are mutually exclusive — combining the single-assignee filter with the ids IN-clause would produce contradictory WHERE conditions, so the builder rejects the combination with ActivitiIllegalArgumentException.","triggerScenarios":"Calling taskAssignee(\"kermit\") earlier on the same TaskQueryImpl and then taskAssigneeIds(list), typically when filters are applied conditionally from multiple code paths or accumulated on a reused query object.","commonSituations":"A generic search endpoint that applies both a user filter and a users-list filter from request parameters; reusing a shared query object across requests without resetting state; accumulating OR/AND filters in a loop.","solutions":["Decide on ONE assignee filter: use either taskAssignee or taskAssigneeIds, never both.","Normalize the input: wrap a single id in a one-element list and always use taskAssigneeIds.","Track which filter was applied and skip the second one (log or warn about the override).","Build a fresh TaskQuery per request instead of mutating a shared instance.","Catch ActivitiIllegalArgumentException and return a 400 explaining the conflicting filters."],"exampleFix":"// before\nquery.taskAssignee(assignee);\nif (assigneeIds != null) {\n    query.taskAssigneeIds(assigneeIds); // throws\n}\n\n// after\nif (assigneeIds != null && !assigneeIds.isEmpty()) {\n    query.taskAssigneeIds(assigneeIds);\n} else if (assignee != null) {\n    query.taskAssignee(assignee);\n}","handlingStrategy":"validation","validationCode":"if (assignee != null && assigneeIds != null) {\n    throw new BadRequestException(\"Use either assignee or assigneeIds, not both\");\n}","typeGuard":"boolean hasConflictingAssigneeFilters(String assignee, List<String> ids) { return assignee != null && ids != null; }","tryCatchPattern":"try {\n    query.taskAssigneeIds(assigneeIds);\n} catch (ActivitiIllegalArgumentException e) {\n    throw new BadRequestException(\"Conflicting assignee filters: \" + e.getMessage());\n}","preventionTips":["Pick one assignee filter mode per query; normalize single ids into a one-element list.","Build a fresh TaskQuery per request; never reuse/mutate shared query objects.","Reject requests that supply both filter types with a clear 400."],"tags":["java","flowable","task-query","conflicting-filters","assignee"],"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"}