diff --git a/APIJSON-Java-Server/APIJSONDemo_oracle/README.MD b/APIJSON-Java-Server/APIJSONDemo_oracle/README.MD new file mode 100644 index 000000000..37fe2c9c1 --- /dev/null +++ b/APIJSON-Java-Server/APIJSONDemo_oracle/README.MD @@ -0,0 +1,185 @@ +# 针对Oracle,APIJSON需要修改源码 + +## 1. 处理`字段括号`的问题,`AbstractSQLConfig.getQuote`,196行 + +```java +@Override +public String getQuote() { + return DATABASE_POSTGRESQL.equalsIgnoreCase(getDatabase()) ? "\"" : "`"; +} +``` + +所以使用的时候需要在`DemoSQLConfig`中添加一个方法 + +```java +@Override +public String getDatabase() { + // TODO Auto-generated method stub + return DATABASE_POSTGRESQL; +} +``` + + + + +## 2. 修改`分页逻辑` + +修改`AbstractSQLConfig.getConditionString`,785行 + +```java +LIMIT count OFFSET page*count +不能改成 getWhereString 后面加 row_num > page*count AND row_num <= (page + 1)*count +需要将整个语句转变成子查询的模式 +SELECT a.* +FROM (SELECT ROWNUM AS rid, t.* +FROM USERS t) a +``` + +Oracle 想要分页,需要子查询,不过如果子查询的话会多出一个字段。 + + + + +## 3. 表名默认是小写,需要改成大写,否则会提示找不到表名的错误 + +修改`AbstractSQLConfig.getSQLTable`,234行 + +```java +@JSONField(serialize = false) + @Override + public String getSQLTable() { + String t = TABLE_KEY_MAP.containsKey(table) ? TABLE_KEY_MAP.get(table) : table; + return DATABASE_POSTGRESQL.equalsIgnoreCase(getDatabase()) ? t.toUpperCase() : t; + } +``` + +其中`toLowerCase`改为`toUpperCase`。 + +`AbstractSQLConfig.getColumnString`,562行 + +```java +for (int j = 0; j < ckeys.length; j++) { + index = ckeys[j].lastIndexOf(":"); //StringUtil.split返回数组中,子项不会有null + origin = index < 0 ? ckeys[j] : ckeys[j].substring(0, index); + origin = origin.toUpperCase(); + alias = index < 0 ? null : ckeys[j].substring(index + 1); + .... +``` + +origin取值的结果要变成大写,这样在前端请求的时候,会忽略字段的大小写。 + + + +## 4. 字段名被引号括起来之后,Oracle区分字段的大小写,需要将字段大写 + +过滤条件的字段`getWhereItem`,1095行 + +```java +key = getRealKey(method, key, false, true, verifyName, getQuote()); +``` + +key的取值也变成大写 + + + +## 5. Order by时,字段名大写 + +`getOrderString`,483行 + +```java +origin = index < 0 ? keys[i] : keys[i].substring(0, index); +origin = origin.toUpperCase(); +``` + + + +## 6. @Combine时,REGEXP函数需要修改 + +`getRegExpString`, 1254行 + +```java +@JSONField(serialize = false) + public String getRegExpString(String key, String value) { + return getKey(key) + " REGEXP " + getValue(value); + } +改为 +return "regexp_like(" + getKey(key) + " , " + getValue(value) + ")"; +``` + + + +## 7. @Group时 + +`getKey`,1119行 + +```java +public String getKey(String key) { + String q = getQuote(); + return (isKeyPrefix() ? getAlias() + "." : "") + q + key + q; +} +改为 +return (isKeyPrefix() ? getAlias() + "." : "") + q + key.toUpperCase() + q; +``` + + + +## 8. 关联查询须知 + +从A表店铺(c_store)中,通过外键字段ID(modifierid)关联查询B表用户(Users)的数据 + +确保相关的实际表名已经配置好,两个表的接口都能单独查询。 + +请求: + +```java +{ + "Store":{ + "@column":"id,name,modifierid" + }, + "Users":{ + "id@":"Store/MODIFIERID", + "@column":"id,name" + } +} +``` + + + +首先,主数据`Store`的字段`modifierid`需要查询出来。其次,`Users`表的关联路径`Store/MODIFIERID`中`modifierid`字段需要大写。 + +响应: + +```json +{ + "[]": [ + { + "Store": { + "CODE": "0003", + "ID": 4, + "NAME": "测试" + }, + "Users": { + "C_STORE_ID": 4, + "ID": 1803, + "NAME": "测试" + } + }, + .... + { + "Store": { + "CODE": "999999", + "ID": 1, + "NAME": "总部仓库" + }, + "Users": { + "C_STORE_ID": 1, + "ID": 1802, + "NAME": "admin" + } + } + ], + "code": 200, + "msg": "success" +} +``` +