{"record":{"id":"2986230ecdb6ffe3","repo":"Tencent/APIJSON","slug":"join-value-value-app","errorCode":null,"errorMessage":"join:value 中 value 里的 {}/{}错误！不支持 {} 等 [ @ APP, < LEFT, > RIGHT, * CROSS, & INNER, | FULL, ! OUTER, ^ SIDE, ( ANTI, ) FOREIGN, ~ ASOF ] 之外的 JOIN 类型 !","messagePattern":"join:value 中 value 里的 (.+?)/(.+?)错误！不支持 (.+?) 等 \\[ @ APP, < LEFT, > RIGHT, \\* CROSS, & INNER, \\| FULL, ! OUTER, \\^ SIDE, \\( ANTI, \\) FOREIGN, ~ ASOF \\] 之外的 JOIN 类型 !","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":400,"severity":"error","filePath":"APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java","lineNumber":3922,"sourceCode":"\t\t\t\t\telse {  // & INNER JOIN: A & B; | FULL JOIN: A | B; OUTER JOIN: ! (A | B)\n\t\t\t\t\t\tint logic = Logic.getType(jt);\n\t\t\t\t\t\tnewWs += \" ( \"\n\t\t\t\t\t\t\t\t+ gainCondition(\n\t\t\t\t\t\t\t\t\t\tLogic.isNot(logic),\n\t\t\t\t\t\t\t\t\t\tws\n\t\t\t\t\t\t\t\t\t\t+ ( isWsEmpty ? \"\" : (Logic.isAnd(logic) ? AND : OR) )\n\t\t\t\t\t\t\t\t\t\t+ \" ( \" + js + \" ) \"\n\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t+ \" ) \";\n\t\t\t\t\t}\n\n\t\t\t\t\tnewPvl.addAll(pvl);\n\t\t\t\t\tnewPvl.addAll(jc.getPreparedValueList());\n\n\t\t\t\t\tchanged = true;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new UnsupportedOperationException(\n\t\t\t\t\t\t\t\"join:value 中 value 里的 \" + jt + \"/\" + j.getPath()\n\t\t\t\t\t\t\t+ \"错误！不支持 \" + jt + \" 等 [ @ APP, < LEFT, > RIGHT, * CROSS\"\n\t\t\t\t\t\t\t+ \", & INNER, | FULL, ! OUTER, ^ SIDE, ( ANTI, ) FOREIGN, ~ ASOF ] 之外的 JOIN 类型 !\"\n\t\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (changed) {\n\t\t\t\twhereString = newWs;\n\t\t\t\tsetPreparedValueList(newPvl);\n\t\t\t}\n\t\t}\n\n\t\treturn whereString;\n\t}\n\n\n\t/**","sourceCodeStart":3904,"sourceCodeEnd":3940,"githubUrl":"https://github.com/Tencent/APIJSON/blob/5284052872898eddc449a58f629e5c8d588b8e22/APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java#L3904-L3940","documentation":"Thrown while concatenating JOIN WHERE strings when a Join object's type is not one of the supported @ APP, < LEFT, > RIGHT, * CROSS, & INNER, | FULL, ! OUTER, ^ SIDE, ( ANTI, ) FOREIGN, ~ ASOF join types. The switch on join type falls into default and rejects the request.","triggerScenarios":"A \"join\": {\".../.../...\": {\"@group\": {\"@type\": ...}}} definition (or joiner string parsed into Join objects) whose type character/enum is misspelled or from a newer/older version vocabulary not understood by this JAR.","commonSituations":"Mixing APIJSON versions between client and server (join type vocabulary differs), typos in @type, or using a JOIN type added in a newer release than the deployed ORM.","solutions":["Use only the documented join type tokens: @, <, >, *, &, |, !, ^, (, ), ~.","Align client and server APIJSON versions so the join type vocabulary matches.","Check the exact join key/path string reported in the message and fix or remove that entry."],"exampleFix":"// before\n\"join\": {\"Comment/userId@/User/id\": {\"@type\": \"XX\"}}\n// after\n\"join\": {\"Comment/userId@/User/id\": {\"@type\": \"@ APP\"}}","handlingStrategy":"validation","validationCode":"const OK_JOIN_TYPES = ['@','<','>','*','&','|','!','^','(',')','~'];\nfunction validJoinType(t) { return OK_JOIN_TYPES.some(x => (t || '').trim().toUpperCase().startsWith(x)); }\nif (!validJoinType(joinDef['@type'])) throw new Error('unsupported join type');","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Restrict join-type input to a whitelist enum in your client.","Pin client and server to the same APIJSON version."],"tags":["apijson","join","unsupported-type","version-mismatch"],"backgroundTag":null,"analyzedSha":"5284052872898eddc449a58f629e5c8d588b8e22","analyzedAt":"2026-08-14T15:15:29.577Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}