{"record":{"id":"4512c87de646d718","repo":"flowable/flowable-engine","slug":"only-string-values-can-be-used-with-like-conditi-4512c8","errorCode":null,"errorMessage":"Only string values can be used with 'like' condition","messagePattern":"Only string values can be used with 'like' condition","errorType":"validation","errorClass":"ActivitiIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"modules/flowable5-engine/src/main/java/org/activiti/engine/impl/AbstractVariableQueryImpl.java","lineNumber":196,"sourceCode":"                    throw new ActivitiIllegalArgumentException(\"Booleans and null cannot be used in 'greater than' condition\");\n                case LESS_THAN:\n                    throw new ActivitiIllegalArgumentException(\"Booleans and null cannot be used in 'less than' condition\");\n                case GREATER_THAN_OR_EQUAL:\n                    throw new ActivitiIllegalArgumentException(\"Booleans and null cannot be used in 'greater than or equal' condition\");\n                case LESS_THAN_OR_EQUAL:\n                    throw new ActivitiIllegalArgumentException(\"Booleans and null cannot be used in 'less than or equal' condition\");\n            }\n\n            if (operator == QueryOperator.EQUALS_IGNORE_CASE && !(value instanceof String)) {\n                throw new ActivitiIllegalArgumentException(\"Only string values can be used with 'equals ignore case' condition\");\n            }\n\n            if (operator == QueryOperator.NOT_EQUALS_IGNORE_CASE && !(value instanceof String)) {\n                throw new ActivitiIllegalArgumentException(\"Only string values can be used with 'not equals ignore case' condition\");\n            }\n\n            if ((operator == QueryOperator.LIKE || operator == QueryOperator.LIKE_IGNORE_CASE) && !(value instanceof String)) {\n                throw new ActivitiIllegalArgumentException(\"Only string values can be used with 'like' condition\");\n            }\n        }\n        queryVariableValues.add(new QueryVariableValue(name, value, operator, localScope));\n    }\n\n    private boolean isBoolean(Object value) {\n        if (value == null) {\n            return false;\n        }\n        return Boolean.class.isAssignableFrom(value.getClass()) || boolean.class.isAssignableFrom(value.getClass());\n    }\n\n    protected void ensureVariablesInitialized() {\n        if (!queryVariableValues.isEmpty()) {\n            VariableTypes variableTypes = Context\n                    .getProcessEngineConfiguration()\n                    .getVariableTypes();\n            for (QueryVariableValue queryVariableValue : queryVariableValues) {","sourceCodeStart":178,"sourceCodeEnd":214,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable5-engine/src/main/java/org/activiti/engine/impl/AbstractVariableQueryImpl.java#L178-L214","documentation":"ActivitiIllegalArgumentException thrown by addVariable when a LIKE or LIKE_IGNORE_CASE condition receives a non-String value. SQL LIKE-style pattern matching operates on strings, so the engine requires the value to be a String and rejects anything else (including null, rejected earlier) at query-build time.","triggerScenarios":"Calling variableValueLike(name, 123), variableValueLikeIgnoreCase(name, someObject), or a generic search builder feeding untyped filter input into LIKE methods.","commonSituations":"Search forms with untyped inputs (numbers for IDs) mapped to 'contains' filters; a numeric variable queried with a pattern filter that was never converted to a String.","solutions":["Convert numeric/other values to String before using LIKE: variableValueLike(name, String.valueOf(num)).","Use variableValueEquals for exact non-string matches instead of pattern matching.","Validate that LIKE filter inputs are Strings (and non-null) before building the query."],"exampleFix":"// before\nquery.taskVariableLike(\"caseNumber\", caseNumber); // Integer\n// after\nquery.taskVariableLike(\"caseNumber\", \"%\" + String.valueOf(caseNumber) + \"%\");","handlingStrategy":"type-guard","validationCode":"if (pattern instanceof String) {\n    query.taskVariableLike(name, (String) pattern);\n} else if (pattern != null) {\n    query.taskVariableValueEquals(name, pattern);\n}","typeGuard":"boolean isString(Object o) { return o instanceof String; }","tryCatchPattern":"try {\n    query.taskVariableLike(name, pattern);\n} catch (ActivitiIllegalArgumentException e) {\n    log.warn(\"Like filter requires a String: {}\", e.getMessage());\n}","preventionTips":["Convert numeric IDs to Strings before pattern matching","Reserve LIKE methods for string patterns; use equals for exact typed matches","Validate 'contains' filter inputs are strings at the form/API boundary"],"tags":["activiti","query","type-mismatch","string"],"backgroundTag":"type-mismatch","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"}