Skip to content

Commit 617cc67

Browse files
committed
Server: 匹配条件范围新增支持 key{}:"=null" 和 key{}:"!=null" 两种 null 值判断;匹配选项范围解决 key!{}:[] (空数组)查不到数据
1 parent 96526c8 commit 617cc67

File tree

1 file changed

+32
-16
lines changed

1 file changed

+32
-16
lines changed

APIJSON-Java-Server/APIJSONORM/src/main/java/zuo/biao/apijson/server/AbstractSQLConfig.java

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1301,7 +1301,10 @@ else if ("!".equals(ce.getKey())) {
13011301

13021302
isItemFirst = false;
13031303
}
1304-
1304+
1305+
if (StringUtil.isEmpty(cs, true)) {//避免SQL条件连接错误
1306+
continue;
1307+
}
13051308

13061309
whereString += (isCombineFirst ? "" : AND) + (Logic.isNot(logic) ? NOT : "") + " ( " + cs + " ) ";
13071310
isCombineFirst = false;
@@ -1768,29 +1771,42 @@ public String getRangeString(String key, Object range) throws Exception {
17681771
}
17691772

17701773
Logic logic = new Logic(key);
1771-
key = logic.getKey();
1772-
Log.i(TAG, "getRangeString key = " + key);
1774+
String k = logic.getKey();
1775+
Log.i(TAG, "getRangeString k = " + k);
17731776

17741777
if (range instanceof List) {
17751778
if (logic.isOr() || logic.isNot()) {
1776-
return getKey(key) + getInString(key, ((List<?>) range).toArray(), logic.isNot());
1779+
List<?> l = (List<?>) range;
1780+
if (logic.isNot() && l.isEmpty()) {
1781+
return ""; // key!{}: [] 这个条件无效,加到 SQL 语句中 key IN() 会报错,getInString 里不好处理
1782+
}
1783+
return getKey(k) + getInString(k, l.toArray(), logic.isNot());
17771784
}
1778-
throw new IllegalArgumentException(key + "{}\":[] 中key末尾的逻辑运算符只能用'|','!'中的一种 !");
1785+
throw new IllegalArgumentException(key + "{}\":[] 中 {} 前面的逻辑运算符错误!只能用'|','!'中的一种 !");
17791786
}
17801787
else if (range instanceof String) {//非Number类型需要客户端拼接成 < 'value0', >= 'value1'这种
1781-
if (isPrepared() && PATTERN_RANGE.matcher((String) range).matches() == false) {
1782-
throw new UnsupportedOperationException("字符串 " + range + " 不合法!预编译模式下 key{}:\"condition\" 中 condition 必须符合正则表达式 ^[0-9%!=<>,]+$ !不允许空格!");
1783-
}
1784-
1785-
String[] conditions = StringUtil.split((String) range);
1788+
String[] cs = StringUtil.split((String) range);
17861789
String condition = "";
1787-
if (conditions != null) {
1790+
if (cs != null) {
1791+
String c;
17881792
int index;
1789-
for (int i = 0; i < conditions.length; i++) {//对函数条件length(key)<=5这种不再在开头加key
1790-
index = conditions[i] == null ? -1 : conditions[i].indexOf("(");
1793+
for (int i = 0; i < cs.length; i++) {//对函数条件length(key)<=5这种不再在开头加key
1794+
c = cs[i];
1795+
if ("=null".equals(c)) {
1796+
c = SQL.isNull();
1797+
}
1798+
else if ("!=null".equals(c)) {
1799+
c = SQL.isNull(false);
1800+
}
1801+
else if (isPrepared() && PATTERN_RANGE.matcher(c).matches() == false) {
1802+
throw new UnsupportedOperationException(key + "{}:value 的 value 中 " + c + " 不合法!"
1803+
+ "预编译模式下 key{}:\"condition\" 中 condition 必须 为 =null 或 !=null 或 符合正则表达式 ^[0-9%!=<>,]+$ !不允许空格!");
1804+
}
1805+
1806+
index = c == null ? -1 : c.indexOf("(");
17911807
condition += ((i <= 0 ? "" : (logic.isAnd() ? AND : OR))//连接方式
1792-
+ (index >= 0 && index < conditions[i].indexOf(")") ? "" : getKey(key) + " ")//函数和非函数条件
1793-
+ conditions[i]);//单个条件
1808+
+ (index >= 0 && index < c.indexOf(")") ? "" : getKey(k) + " ")//函数和非函数条件
1809+
+ c);//单个条件
17941810
}
17951811
}
17961812
if (condition.isEmpty()) {
@@ -1800,7 +1816,7 @@ else if (range instanceof String) {//非Number类型需要客户端拼接成 < '
18001816
return getCondition(logic.isNot(), condition);
18011817
}
18021818
else if (range instanceof Subquery) { //如果在 Parser 解析成 SQL 字符串再引用,没法保证安全性,毕竟可以再通过远程函数等方式来拼接再替代,最后引用的字符串就能注入
1803-
return getKey(key) + (logic.isNot() ? NOT : "") + " IN " + getSubqueryString((Subquery) range);
1819+
return getKey(k) + (logic.isNot() ? NOT : "") + " IN " + getSubqueryString((Subquery) range);
18041820
}
18051821

18061822
throw new IllegalArgumentException(key + "{}:range 类型为" + range.getClass().getSimpleName()

0 commit comments

Comments
 (0)