62
62
import static apijson .JSONObject .KEY_JSON ;
63
63
import static apijson .JSONObject .KEY_NULL ;
64
64
import static apijson .JSONObject .KEY_ORDER ;
65
+ import static apijson .JSONObject .KEY_KEY ;
65
66
import static apijson .JSONObject .KEY_RAW ;
66
67
import static apijson .JSONObject .KEY_ROLE ;
67
68
import static apijson .JSONObject .KEY_SCHEMA ;
@@ -133,6 +134,10 @@ public abstract class AbstractSQLConfig<T extends Object> implements SQLConfig<T
133
134
* 表名映射,隐藏真实表名,对安全要求很高的表可以这么做
134
135
*/
135
136
public static Map <String , String > TABLE_KEY_MAP ;
137
+ /**
138
+ * 字段名映射,隐藏真实字段名,对安全要求很高的表可以这么做,另外可以配置 name_tag:(name,tag) 来实现多字段 IN,length_tag:length(tag) 来实现 SQL 函数复杂条件
139
+ */
140
+ public static Map <String , String > COLUMN_KEY_MAP ;
136
141
/**
137
142
* 允许批量增删改部分记录失败的表
138
143
*/
@@ -907,6 +912,7 @@ public String getUserIdKey() {
907
912
private String havingCombine ; //聚合函数的字符串数组,','分隔
908
913
private Map <String , Object > having ; //聚合函数的字符串数组,','分隔
909
914
private String order ; //排序方式的字符串数组,','分隔
915
+ private Map <String , String > keyMap ; //字段名映射,支持 name_tag:(name,tag) 多字段 IN,year:left(date,4) 截取日期年份等
910
916
private List <String > raw ; //需要保留原始 SQL 的字段,','分隔
911
917
private List <String > json ; //需要转为 JSON 的字段,','分隔
912
918
private Subquery from ; //子查询临时表
@@ -1663,12 +1669,22 @@ public String getOrderString(boolean hasPrefix) {
1663
1669
return (hasPrefix ? " ORDER BY " : "" ) + StringUtil .concat (StringUtil .getString (keys ), joinOrder , ", " );
1664
1670
}
1665
1671
1672
+ @ Override
1673
+ public Map <String , String > getKeyMap () {
1674
+ return keyMap ;
1675
+ }
1676
+ @ Override
1677
+ public AbstractSQLConfig setKeyMap (Map <String , String > keyMap ) {
1678
+ this .keyMap = keyMap ;
1679
+ return this ;
1680
+ }
1681
+
1666
1682
@ Override
1667
1683
public List <String > getRaw () {
1668
1684
return raw ;
1669
1685
}
1670
1686
@ Override
1671
- public SQLConfig setRaw (List <String > raw ) {
1687
+ public AbstractSQLConfig setRaw (List <String > raw ) {
1672
1688
this .raw = raw ;
1673
1689
return this ;
1674
1690
}
@@ -1967,13 +1983,13 @@ public String parseSQLExpression(String key, String expression, boolean containR
1967
1983
return parseSQLExpression (key , expression , containRaw , allowAlias , null );
1968
1984
}
1969
1985
/**解析@column 中以“;”分隔的表达式("@column":"expression1;expression2;expression2;....")中的expression
1970
- * @param key
1971
- * @param expression
1972
- * @param containRaw
1973
- * @param allowAlias
1974
- * @param example
1975
- * @return
1976
- */
1986
+ * @param key
1987
+ * @param expression
1988
+ * @param containRaw
1989
+ * @param allowAlias
1990
+ * @param example
1991
+ * @return
1992
+ */
1977
1993
public String parseSQLExpression (String key , String expression , boolean containRaw , boolean allowAlias , String example ) {
1978
1994
String quote = getQuote ();
1979
1995
int start = expression .indexOf ('(' );
@@ -3486,7 +3502,18 @@ public String getKey(String key) {
3486
3502
return getSQLValue (key ).toString ();
3487
3503
}
3488
3504
3489
- return getSQLKey (key );
3505
+ Map <String , String > keyMap = getKeyMap ();
3506
+ String expression = keyMap == null ? null : keyMap .get (key );
3507
+ if (expression == null ) {
3508
+ expression = COLUMN_KEY_MAP == null ? null : COLUMN_KEY_MAP .get (key );
3509
+ }
3510
+ if (expression == null ) {
3511
+ return getSQLKey (key );
3512
+ }
3513
+
3514
+ // (name,tag) left(date,4) 等
3515
+ List <String > raw = getRaw ();
3516
+ return parseSQLExpression (KEY_KEY , expression , raw != null && raw .contains (KEY_KEY ), false );
3490
3517
}
3491
3518
public String getSQLKey (String key ) {
3492
3519
String q = getQuote ();
@@ -5075,6 +5102,7 @@ else if (userId instanceof Subquery) {}
5075
5102
Object having = request .get (KEY_HAVING );
5076
5103
String havingAnd = request .getString (KEY_HAVING_AND );
5077
5104
String order = request .getString (KEY_ORDER );
5105
+ Object keyMap = request .get (KEY_KEY );
5078
5106
String raw = request .getString (KEY_RAW );
5079
5107
String json = request .getString (KEY_JSON );
5080
5108
String mthd = request .getString (KEY_METHOD );
@@ -5101,6 +5129,7 @@ else if (userId instanceof Subquery) {}
5101
5129
request .remove (KEY_HAVING );
5102
5130
request .remove (KEY_HAVING_AND );
5103
5131
request .remove (KEY_ORDER );
5132
+ request .remove (KEY_KEY );
5104
5133
request .remove (KEY_RAW );
5105
5134
request .remove (KEY_JSON );
5106
5135
request .remove (KEY_METHOD );
@@ -5563,6 +5592,27 @@ else if (newHaving != null) {
5563
5592
}
5564
5593
// @having, @haivng& >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
5565
5594
5595
+ if (keyMap instanceof Map ) {
5596
+ config .setKeyMap ((Map <String , String >) keyMap );
5597
+ }
5598
+ else if (keyMap instanceof String ) {
5599
+ String [] ks = StringUtil .split ((String ) keyMap , ";" );
5600
+ if (ks .length > 0 ) {
5601
+ Map <String , String > nkm = new LinkedHashMap <>();
5602
+ for (int i = 0 ; i < ks .length ; i ++) {
5603
+ Entry <String , String > ety = Pair .parseEntry (ks [i ]);
5604
+ if (ety == null ) {
5605
+ continue ;
5606
+ }
5607
+ nkm .put (ety .getKey (), ety .getValue ());
5608
+ }
5609
+ config .setKeyMap (nkm );
5610
+ }
5611
+ }
5612
+ else if (keyMap != null ) {
5613
+ throw new UnsupportedDataTypeException ("@key:value 中 value 错误,只能是 String, JSONObject 中的一种!" );
5614
+ }
5615
+
5566
5616
5567
5617
config .setExplain (explain != null && explain );
5568
5618
config .setCache (getCache (cache ));
@@ -5649,6 +5699,9 @@ else if (newHaving != null) {
5649
5699
if (order != null ) {
5650
5700
request .put (KEY_ORDER , order );
5651
5701
}
5702
+ if (keyMap != null ) {
5703
+ request .put (KEY_KEY , keyMap );
5704
+ }
5652
5705
if (raw != null ) {
5653
5706
request .put (KEY_RAW , raw );
5654
5707
}
0 commit comments