{"record":{"id":"9ede439249317948","repo":"mybatis/mybatis-3","slug":"expression-based-parameters-are-not-supported-yet","errorCode":null,"errorMessage":"Expression based parameters are not supported yet","messagePattern":"Expression based parameters are not supported yet","errorType":"exception","errorClass":"BuilderException","httpStatus":null,"severity":"error","filePath":"src/main/java/org/apache/ibatis/builder/ParameterMappingTokenHandler.java","lineNumber":119,"sourceCode":"      typeHandler = resolveTypeHandler(genericType, jdbcType, typeHandlerAlias);\n    }\n    builder.typeHandler(typeHandler);\n\n    ParameterMode mode = null;\n    for (Map.Entry<String, String> entry : propertiesMap.entrySet()) {\n      String name = entry.getKey();\n      String value = entry.getValue();\n      if (\"mode\".equals(name)) {\n        mode = resolveParameterMode(value);\n        builder.mode(mode);\n      } else if (\"numericScale\".equals(name)) {\n        builder.numericScale(Integer.valueOf(value));\n      } else if (\"resultMap\".equals(name)) {\n        builder.resultMapId(value);\n      } else if (\"jdbcTypeName\".equals(name)) {\n        builder.jdbcTypeName(value);\n      } else if (\"expression\".equals(name)) {\n        throw new BuilderException(\"Expression based parameters are not supported yet\");\n      } else {\n        throw new BuilderException(\"An invalid property '\" + name + \"' was found in mapping #{\" + content\n            + \"}.  Valid properties are \" + PARAMETER_PROPERTIES);\n      }\n    }\n    if (!ParameterMode.OUT.equals(mode) && paramExists) {\n      if (metaParameters.hasGetter(propertyTokenizer.getName())) {\n        builder.value(metaParameters.getValue(property));\n      } else if (parameterObject == null) {\n        builder.value(null);\n      } else if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {\n        builder.value(parameterObject);\n      } else {\n        MetaObject metaObject = configuration.newMetaObject(parameterObject);\n        builder.value(metaObject.getValue(property));\n      }\n    }\n    return builder.build();","sourceCodeStart":101,"sourceCodeEnd":137,"githubUrl":"https://github.com/mybatis/mybatis-3/blob/008069adb1b089579b5dcba87ee591908b263274/src/main/java/org/apache/ibatis/builder/ParameterMappingTokenHandler.java#L101-L137","documentation":"Thrown by ParameterMappingTokenHandler when a #{} placeholder contains an 'expression=...' option. MyBatis once planned OGNL-based parameter expressions inside placeholders but never shipped support; the option is recognized by the parser (to give a precise message) yet explicitly unsupported and rejected.","triggerScenarios":"Writing #{user,expression=id > 100} or any placeholder option list containing expression=... in an XML mapper or annotation SQL.","commonSituations":"Developers attempt dynamic per-row expressions in a batch or try to inline computed values; occasionally copied from very old MyBatis 2.x / iBATIS examples where similar syntax existed.","solutions":["Remove the expression option and compute the value in Java before passing the parameter","Use <if>/<choose>/<foreach> dynamic SQL (or @SelectProvider / Provider SQL builder) for conditional logic","For static trusted text, ${} substitution can be used with full SQL-injection caution"],"exampleFix":"<!-- before -->\n#{user,expression=name.toUpperCase()}\n<!-- after -->\nquery.setName(user.getName().toUpperCase());\n... WHERE name = #{name}","handlingStrategy":"validation","validationCode":"// Fail fast if generated SQL contains the unsupported expression option\nif (sql.contains(\"expression=\")) {\n  throw new UnsupportedOperationException(\"#{...,expression=...} is not supported by MyBatis\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Do not attempt per-row expressions in placeholders — compute values in Java","Use <if>/<foreach> or @SelectProvider for conditional SQL"],"tags":["mybatis","parameter-mapping","unsupported-feature"],"backgroundTag":null,"analyzedSha":"008069adb1b089579b5dcba87ee591908b263274","analyzedAt":"2026-08-14T13:07:10.264Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}