{"record":{"id":"ed0ccef20b72845a","repo":"flowable/flowable-engine","slug":"invalid-query-usage-cannot-set-both-tasknamein-an","errorCode":null,"errorMessage":"Invalid query usage: cannot set both taskNameIn and taskName","messagePattern":"Invalid query usage: cannot set both taskNameIn and taskName","errorType":"validation","errorClass":"FlowableIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable-task-service/src/main/java/org/flowable/task/service/impl/HistoricTaskInstanceQueryImpl.java","lineNumber":746,"sourceCode":"        if (inOrStatement) {\n            this.currentOrQueryObject.taskName = taskName;\n        } else {\n            this.taskName = taskName;\n        }\n        return this;\n    }\n\n    @Override\n    public HistoricTaskInstanceQuery taskNameIn(Collection<String> taskNameList) {\n        if (taskNameList == null) {\n            throw new FlowableIllegalArgumentException(\"Task name list is null\");\n        }\n        if (taskNameList.isEmpty()) {\n            throw new FlowableIllegalArgumentException(\"Task name list is empty\");\n        }\n\n        if (taskName != null) {\n            throw new FlowableIllegalArgumentException(\"Invalid query usage: cannot set both taskNameIn and taskName\");\n        }\n        if (taskNameLike != null) {\n            throw new FlowableIllegalArgumentException(\"Invalid query usage: cannot set both taskNameIn and taskNameLike\");\n        }\n        if (taskNameLikeIgnoreCase != null) {\n            throw new FlowableIllegalArgumentException(\"Invalid query usage: cannot set both taskNameIn and taskNameLikeIgnoreCase\");\n        }\n\n        if (inOrStatement) {\n            currentOrQueryObject.taskNameList = taskNameList;\n        } else {\n            this.taskNameList = taskNameList;\n        }\n        return this;\n    }\n\n    @Override\n    public HistoricTaskInstanceQuery taskNameInIgnoreCase(Collection<String> taskNameList) {","sourceCodeStart":728,"sourceCodeEnd":764,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-task-service/src/main/java/org/flowable/task/service/impl/HistoricTaskInstanceQueryImpl.java#L728-L764","documentation":"HistoricTaskInstanceQueryImpl.taskNameIn(Collection) throws FlowableIllegalArgumentException when a taskName filter was already set on the same query. Flowable forbids combining exact-name equality (taskName) with the name IN-list filter because the SQL conditions are mutually exclusive in the intended semantics. Only one of the two name filters may be applied per query.","triggerScenarios":"Calling historicTaskInstanceQuery().taskName(\"review\").taskNameIn(List.of(\"review\", \"approve\")) — i.e., invoking taskNameIn after taskName (or vice versa) on the same query instance, including via shared query-building code.","commonSituations":"Layered filter builders where a base method sets taskName and a later override adds taskNameIn; merging user-supplied filters where both exact and list filters were provided; copy-pasted query code reusing a partially built query object.","solutions":["Choose one filter: remove the taskName call when using taskNameIn, or vice versa.","Convert the single name into a one-element list and use only taskNameIn: taskNameIn(List.of(name)).","Track which name filter is active in your builder code and set it exactly once."],"exampleFix":"// before\nquery.taskName(\"review\");\nquery.taskNameIn(Arrays.asList(\"review\", \"approve\")); // conflict\n// after\nquery.taskNameIn(Arrays.asList(\"review\", \"approve\"));","handlingStrategy":"validation","validationCode":"boolean exactNameSet = (query instanceof HistoricTaskInstanceQueryImpl q) && q.getTaskName() != null;\nif (exactNameSet && names != null) {\n    throw new IllegalStateException(\"Use either taskName or taskNameIn, not both\");\n}","typeGuard":"boolean nameFiltersCompatible(String taskName, String taskNameLike, Collection<String> taskNameIn) {\n    int set = (taskName != null ? 1 : 0) + (taskNameLike != null ? 1 : 0) + (taskNameIn != null && !taskNameIn.isEmpty() ? 1 : 0);\n    return set <= 1;\n}","tryCatchPattern":"try {\n    query.taskNameIn(names);\n} catch (FlowableIllegalArgumentException e) {\n    logger.warn(\"Conflicting task name filters: {}\", e.getMessage());\n}","preventionTips":["Decide on exactly one task-name filter strategy per query path (exact, like, or in-list).","Never mutate a shared/reused query object with additional name filters.","Write a small builder that internally picks one name filter and ignores the rest."],"tags":["flowable","query-builder","conflicting-filters","invalid-query-usage"],"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"}