Skip to content

Commit 96ee9dd

Browse files
committed
LIKE: 支持非 JOIN ON 引用赋值也能用 key%$:value 格式,并且给 key%$:"%" 中的特殊符号转义
1 parent d4213e2 commit 96ee9dd

1 file changed

Lines changed: 49 additions & 3 deletions

File tree

APIJSONORM/src/main/java/apijson/orm/AbstractSQLConfig.java

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2982,7 +2982,7 @@ public Object getSQLValue(@NotNull Object value) {
29822982
return SQL.NULL;
29832983
}
29842984
// return (value instanceof Number || value instanceof Boolean) && DATABASE_POSTGRESQL.equals(getDatabase()) ? value : "'" + value + "'";
2985-
return (value instanceof Number || value instanceof Boolean) ? value : "'" + value.toString().replaceAll("'", "\\'") + "'"; //MySQL 隐式转换用不了索引
2985+
return (value instanceof Number || value instanceof Boolean) ? value : "'" + value.toString().replaceAll("\\'", "\\\\'") + "'"; //MySQL 隐式转换用不了索引
29862986
}
29872987

29882988
@Override
@@ -3044,7 +3044,7 @@ public String getSearchString(String key, String column, Object[] values, int ty
30443044
// throw new IllegalArgumentException(key + "$:value 中 value 值 " + v + " 中包含 %% !不允许有连续的 % !");
30453045
// }
30463046

3047-
condition += (i <= 0 ? "" : (Logic.isAnd(type) ? AND : OR)) + getLikeString(key, column, v);
3047+
condition += (i <= 0 ? "" : (Logic.isAnd(type) ? AND : OR)) + getLikeString(key, column, (String) v);
30483048
}
30493049

30503050
return getCondition(Logic.isNot(type), condition);
@@ -3057,7 +3057,53 @@ public String getSearchString(String key, String column, Object[] values, int ty
30573057
* @return key LIKE 'value'
30583058
*/
30593059
@JSONField(serialize = false)
3060-
public String getLikeString(String key, String column, Object value) {
3060+
public String getLikeString(@NotNull String key, @NotNull String column, String value) {
3061+
String k = key.substring(0, key.length() - 1);
3062+
char r = k.charAt(k.length() - 1);
3063+
3064+
char l;
3065+
if (r == '%' || r == '_' || r == '?') {
3066+
k = k.substring(0, k.length() - 1);
3067+
3068+
l = k.charAt(k.length() - 1);
3069+
if (l == '%' || l == '_' || l == '?') {
3070+
if (l == r) {
3071+
throw new IllegalArgumentException(key + ":value 中字符 " + k + " 不合法!key$:value 中不允许 key 中有连续相同的占位符!");
3072+
}
3073+
3074+
k = k.substring(0, k.length() - 1);
3075+
}
3076+
else if (l > 0 && StringUtil.isName(String.valueOf(l))) {
3077+
l = r;
3078+
}
3079+
3080+
if (l == '?') {
3081+
l = 0;
3082+
}
3083+
if (r == '?') {
3084+
r = 0;
3085+
}
3086+
}
3087+
else {
3088+
l = r = 0;
3089+
}
3090+
3091+
if (l > 0 || r > 0) {
3092+
if (value == null) {
3093+
throw new IllegalArgumentException(key + ":value 中 value 为 null!key$:value 中 value 不能为 null,且类型必须是 String !");
3094+
}
3095+
3096+
value = value.replaceAll("\\\\", "\\\\\\\\");
3097+
value = value.replaceAll("\\%", "\\\\%");
3098+
value = value.replaceAll("\\_", "\\\\_");
3099+
if (l > 0) {
3100+
value = l + value;
3101+
}
3102+
if (r > 0) {
3103+
value = value + r;
3104+
}
3105+
}
3106+
30613107
return getKey(column) + " LIKE " + getValue(key, column, value);
30623108
}
30633109

0 commit comments

Comments
 (0)