{"record":{"id":"44a26be4e3234942","repo":"Tencent/APIJSON","slug":"raw-value-raw-key-key","errorCode":null,"errorMessage":"@raw:value 中 {} 不合法！@raw 不支持 key$ 这种功能符 ！只支持 key, key!, key<, key{} 等比较运算 和 @column, @having ！","messagePattern":"@raw:value 中 (.+?) 不合法！@raw 不支持 key\\$ 这种功能符 ！只支持 key, key!, key<, key(.+?) 等比较运算 和 @column, @having ！","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":400,"severity":"error","filePath":"APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java","lineNumber":4183,"sourceCode":"\t}\n\t@Override\n\tpublic AbstractSQLConfig<T, M, L> setPreparedValueList(List<Object> preparedValueList) {\n\t\tthis.preparedValueList = preparedValueList;\n\t\treturn this;\n\t}\n\n\t//$ search <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n\t/**search key match value\n\t* @param key\n\t* @param column\n\t* @param value\n\t* @param rawSQL\n\t* @return {@link #gainSearchString(String, String, Object[], int)}\n\t* @throws IllegalArgumentException\n\t*/\n\tpublic String gainSearchString(String key, String column, Object value, String rawSQL) throws IllegalArgumentException {\n\t\tif (rawSQL != null) {\n\t\t\tthrow new UnsupportedOperationException(\"@raw:value 中 \"\n\t\t\t\t\t+ key + \" 不合法！@raw 不支持 key$ 这种功能符 ！只支持 key, key!, key<, key{} 等比较运算 和 @column, @having ！\");\n\t\t}\n\t\tif (value == null) {\n\t\t\treturn \"\";\n\t\t}\n\n\t\tLogic logic = new Logic(column);\n\t\tcolumn = logic.getKey();\n\t\tLog.i(TAG, \"getSearchString column = \" + column);\n\n\t\tList<Object> arr = newJSONArray(value);\n\t\tif (arr.isEmpty()) {\n\t\t\treturn \"\";\n\t\t}\n\t\treturn gainSearchString(key, column, arr.toArray(), logic.getType());\n\t}\n\t/**search key match values\n\t* @param key","sourceCodeStart":4165,"sourceCodeEnd":4201,"githubUrl":"https://github.com/Tencent/APIJSON/blob/5284052872898eddc449a58f629e5c8d588b8e22/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java#L4165-L4201","documentation":"Thrown by gainSearchString when @raw is applied to a key with the '$' search suffix. @raw only supports plain comparison keys (key, key!, key<, key{}, etc.) and @column/@having; the fuzzy-search operator key$ requires the library to build LIKE patterns itself and cannot be mixed with raw SQL.","triggerScenarios":"A request with \"@raw\": [\"name$\"] (or a raw map naming a key$) together with \"name$\": \"%a%\" — asking APIJSON to treat the search operator's value as raw SQL.","commonSituations":"Developers trying to inject a custom LIKE/REGEXP expression via @raw on the search key instead of using key$ normally or moving the expression into @column/@having.","solutions":["Remove the key$ entry from @raw and use plain key$ with a normal search string so APIJSON builds the LIKE itself.","If a custom expression is required, put it in @column/@having where @raw is supported.","Check the @raw list for stale key names after refactoring request bodies."],"exampleFix":"// before\n{\"User\": {\"name$\": \"%a%\", \"@raw\": \"name$\"}}\n// after\n{\"User\": {\"name$\": \"%a%\"}}","handlingStrategy":"validation","validationCode":"const raw = req[table]['@raw'];\nif (raw) {\n  const list = Array.isArray(raw) ? raw : Object.keys(raw);\n  const bad = list.filter(k => k.endsWith('$'));\n  if (bad.length) throw new Error('@raw does not support key$ : ' + bad.join(','));\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Whitelist @raw entries to key, key!, key<, key>, key{}, @column, @having.","Use key$ only with normal string search values."],"tags":["apijson","raw-sql","search","unsupported-operator"],"backgroundTag":null,"analyzedSha":"5284052872898eddc449a58f629e5c8d588b8e22","analyzedAt":"2026-08-14T15:15:29.577Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}