Skip to content

Commit a0a1ef7

Browse files
authored
Merge pull request #47 from Zerounary/master
使用Oracle数据库时,源码的一些调整
2 parents 19a6300 + 42c39eb commit a0a1ef7

File tree

1 file changed

+185
-0
lines changed
  • APIJSON-Java-Server/APIJSONDemo_oracle

1 file changed

+185
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
# 针对Oracle,APIJSON需要修改源码
2+
3+
## 1. 处理`字段括号`的问题,`AbstractSQLConfig.getQuote`,196行
4+
5+
```java
6+
@Override
7+
public String getQuote() {
8+
return DATABASE_POSTGRESQL.equalsIgnoreCase(getDatabase()) ? "\"" : "`";
9+
}
10+
```
11+
12+
所以使用的时候需要在`DemoSQLConfig`中添加一个方法
13+
14+
```java
15+
@Override
16+
public String getDatabase() {
17+
// TODO Auto-generated method stub
18+
return DATABASE_POSTGRESQL;
19+
}
20+
```
21+
22+
23+
24+
25+
## 2. 修改`分页逻辑`
26+
27+
修改`AbstractSQLConfig.getConditionString`,785行
28+
29+
```java
30+
LIMIT count OFFSET page*count
31+
不能改成 getWhereString 后面加 row_num > page*count AND row_num <= (page + 1)*count
32+
需要将整个语句转变成子查询的模式
33+
SELECT a.*
34+
FROM (SELECT ROWNUM AS rid, t.*
35+
FROM USERS t) a
36+
```
37+
38+
Oracle 想要分页,需要子查询,不过如果子查询的话会多出一个字段。
39+
40+
41+
42+
43+
## 3. 表名默认是小写,需要改成大写,否则会提示找不到表名的错误
44+
45+
修改`AbstractSQLConfig.getSQLTable`,234行
46+
47+
```java
48+
@JSONField(serialize = false)
49+
@Override
50+
public String getSQLTable() {
51+
String t = TABLE_KEY_MAP.containsKey(table) ? TABLE_KEY_MAP.get(table) : table;
52+
return DATABASE_POSTGRESQL.equalsIgnoreCase(getDatabase()) ? t.toUpperCase() : t;
53+
}
54+
```
55+
56+
其中`toLowerCase`改为`toUpperCase`
57+
58+
`AbstractSQLConfig.getColumnString`,562行
59+
60+
```java
61+
for (int j = 0; j < ckeys.length; j++) {
62+
index = ckeys[j].lastIndexOf(":"); //StringUtil.split返回数组中,子项不会有null
63+
origin = index < 0 ? ckeys[j] : ckeys[j].substring(0, index);
64+
origin = origin.toUpperCase();
65+
alias = index < 0 ? null : ckeys[j].substring(index + 1);
66+
....
67+
```
68+
69+
origin取值的结果要变成大写,这样在前端请求的时候,会忽略字段的大小写。
70+
71+
72+
73+
## 4. 字段名被引号括起来之后,Oracle区分字段的大小写,需要将字段大写
74+
75+
过滤条件的字段`getWhereItem`,1095
76+
77+
```java
78+
key = getRealKey(method, key, false, true, verifyName, getQuote());
79+
```
80+
81+
key的取值也变成大写
82+
83+
84+
85+
## 5. Order by时,字段名大写
86+
87+
`getOrderString`,483
88+
89+
```java
90+
origin = index < 0 ? keys[i] : keys[i].substring(0, index);
91+
origin = origin.toUpperCase();
92+
```
93+
94+
95+
96+
## 6. @Combine时,REGEXP函数需要修改
97+
98+
`getRegExpString`, 1254
99+
100+
```java
101+
@JSONField(serialize = false)
102+
public String getRegExpString(String key, String value) {
103+
return getKey(key) + " REGEXP " + getValue(value);
104+
}
105+
改为
106+
return "regexp_like(" + getKey(key) + " , " + getValue(value) + ")";
107+
```
108+
109+
110+
111+
## 7. @Group
112+
113+
`getKey`,1119
114+
115+
```java
116+
public String getKey(String key) {
117+
String q = getQuote();
118+
return (isKeyPrefix() ? getAlias() + "." : "") + q + key + q;
119+
}
120+
改为
121+
return (isKeyPrefix() ? getAlias() + "." : "") + q + key.toUpperCase() + q;
122+
```
123+
124+
125+
126+
## 8. 关联查询须知
127+
128+
A表店铺(c_store)中,通过外键字段ID(modifierid)关联查询B表用户(Users)的数据
129+
130+
确保相关的实际表名已经配置好,两个表的接口都能单独查询。
131+
132+
请求:
133+
134+
```java
135+
{
136+
"Store":{
137+
"@column":"id,name,modifierid"
138+
},
139+
"Users":{
140+
"id@":"Store/MODIFIERID",
141+
"@column":"id,name"
142+
}
143+
}
144+
```
145+
146+
147+
148+
首先,主数据`Store`的字段`modifierid`需要查询出来。其次,`Users`表的关联路径`Store/MODIFIERID`中`modifierid`字段需要大写。
149+
150+
响应:
151+
152+
```json
153+
{
154+
"[]": [
155+
{
156+
"Store": {
157+
"CODE": "0003",
158+
"ID": 4,
159+
"NAME": "测试"
160+
},
161+
"Users": {
162+
"C_STORE_ID": 4,
163+
"ID": 1803,
164+
"NAME": "测试"
165+
}
166+
},
167+
....
168+
{
169+
"Store": {
170+
"CODE": "999999",
171+
"ID": 1,
172+
"NAME": "总部仓库"
173+
},
174+
"Users": {
175+
"C_STORE_ID": 1,
176+
"ID": 1802,
177+
"NAME": "admin"
178+
}
179+
}
180+
],
181+
"code": 200,
182+
"msg": "success"
183+
}
184+
```
185+

0 commit comments

Comments
 (0)