32693d45aeb5c53fa31cf9e4f5fb2b02b12f617d.svn-base 39 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138
  1. package org.jeecg.common.system.query;
  2. import java.beans.PropertyDescriptor;
  3. import java.io.UnsupportedEncodingException;
  4. import java.lang.reflect.Field;
  5. import java.math.BigDecimal;
  6. import java.net.URLDecoder;
  7. import java.text.ParseException;
  8. import java.text.SimpleDateFormat;
  9. import java.util.*;
  10. import java.util.regex.Matcher;
  11. import java.util.regex.Pattern;
  12. import java.util.stream.Collectors;
  13. import org.apache.commons.beanutils.PropertyUtils;
  14. import org.jeecg.common.constant.CommonConstant;
  15. import org.jeecg.common.constant.DataBaseConstant;
  16. import org.jeecg.common.system.util.JeecgDataAutorUtils;
  17. import org.jeecg.common.system.util.JwtUtil;
  18. import org.jeecg.common.system.vo.SysPermissionDataRuleModel;
  19. import org.jeecg.common.util.CommonUtils;
  20. import org.jeecg.common.util.DateUtils;
  21. import org.jeecg.common.util.SqlInjectionUtil;
  22. import org.jeecg.common.util.oConvertUtils;
  23. import org.springframework.util.NumberUtils;
  24. import com.alibaba.fastjson.JSON;
  25. import com.baomidou.mybatisplus.annotation.DbType;
  26. import com.baomidou.mybatisplus.annotation.TableField;
  27. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  28. import lombok.extern.slf4j.Slf4j;
  29. @Slf4j
  30. public class QueryGenerator {
  31. public static final String SQL_RULES_COLUMN = "SQL_RULES_COLUMN";
  32. private static final String BEGIN = "_begin";
  33. private static final String END = "_end";
  34. /**
  35. * 数字类型字段,拼接此后缀 接受多值参数
  36. */
  37. private static final String MULTI = "_MultiString";
  38. private static final String STAR = "*";
  39. private static final String COMMA = ",";
  40. /**
  41. * 查询 逗号转义符 相当于一个逗号【作废】
  42. */
  43. public static final String QUERY_COMMA_ESCAPE = "++";
  44. private static final String NOT_EQUAL = "!";
  45. /**页面带有规则值查询,空格作为分隔符*/
  46. private static final String QUERY_SEPARATE_KEYWORD = " ";
  47. /**高级查询前端传来的参数名*/
  48. private static final String SUPER_QUERY_PARAMS = "superQueryParams";
  49. /** 高级查询前端传来的拼接方式参数名 */
  50. private static final String SUPER_QUERY_MATCH_TYPE = "superQueryMatchType";
  51. /** 单引号 */
  52. public static final String SQL_SQ = "'";
  53. /**排序列*/
  54. private static final String ORDER_COLUMN = "column";
  55. /**排序方式*/
  56. private static final String ORDER_TYPE = "order";
  57. private static final String ORDER_TYPE_ASC = "ASC";
  58. /**mysql 模糊查询之特殊字符下划线 (_、\)*/
  59. public static final String LIKE_MYSQL_SPECIAL_STRS = "_,%";
  60. /**时间格式化 */
  61. private static final ThreadLocal<SimpleDateFormat> local = new ThreadLocal<SimpleDateFormat>();
  62. private static SimpleDateFormat getTime(){
  63. SimpleDateFormat time = local.get();
  64. if(time == null){
  65. time = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  66. local.set(time);
  67. }
  68. return time;
  69. }
  70. /**
  71. * 获取查询条件构造器QueryWrapper实例 通用查询条件已被封装完成
  72. * @param searchObj 查询实体
  73. * @param parameterMap request.getParameterMap()
  74. * @return QueryWrapper实例
  75. */
  76. public static <T> QueryWrapper<T> initQueryWrapper(T searchObj,Map<String, String[]> parameterMap){
  77. long start = System.currentTimeMillis();
  78. QueryWrapper<T> queryWrapper = new QueryWrapper<T>();
  79. installMplus(queryWrapper, searchObj, parameterMap);
  80. log.debug("---查询条件构造器初始化完成,耗时:"+(System.currentTimeMillis()-start)+"毫秒----");
  81. return queryWrapper;
  82. }
  83. /**
  84. * 组装Mybatis Plus 查询条件
  85. * <p>使用此方法 需要有如下几点注意:
  86. * <br>1.使用QueryWrapper 而非LambdaQueryWrapper;
  87. * <br>2.实例化QueryWrapper时不可将实体传入参数
  88. * <br>错误示例:如QueryWrapper<JeecgDemo> queryWrapper = new QueryWrapper<JeecgDemo>(jeecgDemo);
  89. * <br>正确示例:QueryWrapper<JeecgDemo> queryWrapper = new QueryWrapper<JeecgDemo>();
  90. * <br>3.也可以不使用这个方法直接调用 {@link #initQueryWrapper}直接获取实例
  91. */
  92. public static void installMplus(QueryWrapper<?> queryWrapper,Object searchObj,Map<String, String[]> parameterMap) {
  93. /*
  94. * 注意:权限查询由前端配置数据规则 当一个人有多个所属部门时候 可以在规则配置包含条件 orgCode 包含 #{sys_org_code}
  95. 但是不支持在自定义SQL中写orgCode in #{sys_org_code}
  96. 当一个人只有一个部门 就直接配置等于条件: orgCode 等于 #{sys_org_code} 或者配置自定义SQL: orgCode = '#{sys_org_code}'
  97. */
  98. //区间条件组装 模糊查询 高级查询组装 简单排序 权限查询
  99. PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(searchObj);
  100. Map<String,SysPermissionDataRuleModel> ruleMap = getRuleMap();
  101. //权限规则自定义SQL表达式
  102. for (String c : ruleMap.keySet()) {
  103. if(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){
  104. queryWrapper.and(i ->i.apply(getSqlRuleValue(ruleMap.get(c).getRuleValue())));
  105. }
  106. }
  107. String name, type, column;
  108. // update-begin--Author:taoyan Date:20200923 for:issues/1671 如果字段加注解了@TableField(exist = false),不走DB查询-------
  109. //定义实体字段和数据库字段名称的映射 高级查询中 只能获取实体字段 如果设置TableField注解 那么查询条件会出问题
  110. Map<String,String> fieldColumnMap = new HashMap<String,String>();
  111. for (int i = 0; i < origDescriptors.length; i++) {
  112. //aliasName = origDescriptors[i].getName(); mybatis 不存在实体属性 不用处理别名的情况
  113. name = origDescriptors[i].getName();
  114. type = origDescriptors[i].getPropertyType().toString();
  115. try {
  116. if (judgedIsUselessField(name)|| !PropertyUtils.isReadable(searchObj, name)) {
  117. continue;
  118. }
  119. Object value = PropertyUtils.getSimpleProperty(searchObj, name);
  120. column = getTableFieldName(searchObj.getClass(), name);
  121. if(column==null){
  122. //column为null只有一种情况 那就是 添加了注解@TableField(exist = false) 后续都不用处理了
  123. continue;
  124. }
  125. fieldColumnMap.put(name,column);
  126. //数据权限查询
  127. if(ruleMap.containsKey(name)) {
  128. addRuleToQueryWrapper(ruleMap.get(name), column, origDescriptors[i].getPropertyType(), queryWrapper);
  129. }
  130. //区间查询
  131. doIntervalQuery(queryWrapper, parameterMap, type, name, column);
  132. //判断单值 参数带不同标识字符串 走不同的查询
  133. //TODO 这种前后带逗号的支持分割后模糊查询需要否 使多选字段的查询生效
  134. if (null != value && value.toString().startsWith(COMMA) && value.toString().endsWith(COMMA)) {
  135. String multiLikeval = value.toString().replace(",,", COMMA);
  136. String[] vals = multiLikeval.substring(1, multiLikeval.length()).split(COMMA);
  137. final String field = oConvertUtils.camelToUnderline(column);
  138. if(vals.length>1) {
  139. queryWrapper.and(j -> {
  140. j = j.like(field,vals[0]);
  141. for (int k=1;k<vals.length;k++) {
  142. j = j.or().like(field,vals[k]);
  143. }
  144. //return j;
  145. });
  146. }else {
  147. queryWrapper.and(j -> j.like(field,vals[0]));
  148. }
  149. }else {
  150. //根据参数值带什么关键字符串判断走什么类型的查询
  151. QueryRuleEnum rule = convert2Rule(value);
  152. value = replaceValue(rule,value);
  153. // add -begin 添加判断为字符串时设为全模糊查询
  154. if( (rule==null || QueryRuleEnum.EQ.equals(rule)) && "class java.lang.String".equals(type)) {
  155. // 可以设置左右模糊或全模糊,因人而异
  156. rule = QueryRuleEnum.LIKE;
  157. }
  158. // add -end 添加判断为字符串时设为全模糊查询
  159. addEasyQuery(queryWrapper, column, rule, value);
  160. }
  161. } catch (Exception e) {
  162. log.error(e.getMessage(), e);
  163. }
  164. }
  165. // 排序逻辑 处理
  166. doMultiFieldsOrder(queryWrapper, parameterMap);
  167. //高级查询
  168. doSuperQuery(queryWrapper, parameterMap, fieldColumnMap);
  169. // update-end--Author:taoyan Date:20200923 for:issues/1671 如果字段加注解了@TableField(exist = false),不走DB查询-------
  170. }
  171. /**
  172. * 区间查询
  173. * @param queryWrapper query对象
  174. * @param parameterMap 参数map
  175. * @param type 字段类型
  176. * @param filedName 字段名称
  177. * @param columnName 列名称
  178. */
  179. private static void doIntervalQuery(QueryWrapper<?> queryWrapper, Map<String, String[]> parameterMap, String type, String filedName, String columnName) throws ParseException {
  180. // 添加 判断是否有区间值
  181. String endValue = null,beginValue = null;
  182. if (parameterMap != null && parameterMap.containsKey(filedName + BEGIN)) {
  183. beginValue = parameterMap.get(filedName + BEGIN)[0].trim();
  184. addQueryByRule(queryWrapper, columnName, type, beginValue, QueryRuleEnum.GE);
  185. }
  186. if (parameterMap != null && parameterMap.containsKey(filedName + END)) {
  187. endValue = parameterMap.get(filedName + END)[0].trim();
  188. addQueryByRule(queryWrapper, columnName, type, endValue, QueryRuleEnum.LE);
  189. }
  190. //多值查询
  191. if (parameterMap != null && parameterMap.containsKey(filedName + MULTI)) {
  192. endValue = parameterMap.get(filedName + MULTI)[0].trim();
  193. addQueryByRule(queryWrapper, columnName.replace(MULTI,""), type, endValue, QueryRuleEnum.IN);
  194. }
  195. }
  196. //多字段排序 TODO 需要修改前端
  197. public static void doMultiFieldsOrder(QueryWrapper<?> queryWrapper,Map<String, String[]> parameterMap) {
  198. String column=null,order=null;
  199. if(parameterMap!=null&& parameterMap.containsKey(ORDER_COLUMN)) {
  200. column = parameterMap.get(ORDER_COLUMN)[0];
  201. }
  202. if(parameterMap!=null&& parameterMap.containsKey(ORDER_TYPE)) {
  203. order = parameterMap.get(ORDER_TYPE)[0];
  204. }
  205. log.info("排序规则>>列:" + column + ",排序方式:" + order);
  206. if (oConvertUtils.isNotEmpty(column) && oConvertUtils.isNotEmpty(order)) {
  207. //字典字段,去掉字典翻译文本后缀
  208. if(column.endsWith(CommonConstant.DICT_TEXT_SUFFIX)) {
  209. column = column.substring(0, column.lastIndexOf(CommonConstant.DICT_TEXT_SUFFIX));
  210. }
  211. //SQL注入check
  212. SqlInjectionUtil.filterContent(column);
  213. //update-begin--Author:scott Date:20210531 for:36 多条件排序无效问题修正-------
  214. // 排序规则修改
  215. // 将现有排序 _ 前端传递排序条件{....,column: 'column1,column2',order: 'desc'} 翻译成sql "column1,column2 desc"
  216. // 修改为 _ 前端传递排序条件{....,column: 'column1,column2',order: 'desc'} 翻译成sql "column1 desc,column2 desc"
  217. if (order.toUpperCase().indexOf(ORDER_TYPE_ASC)>=0) {
  218. //queryWrapper.orderByAsc(oConvertUtils.camelToUnderline(column));
  219. String columnStr = oConvertUtils.camelToUnderline(column);
  220. String[] columnArray = columnStr.split(",");
  221. queryWrapper.orderByAsc(Arrays.asList(columnArray));
  222. } else {
  223. //queryWrapper.orderByDesc(oConvertUtils.camelToUnderline(column));
  224. String columnStr = oConvertUtils.camelToUnderline(column);
  225. String[] columnArray = columnStr.split(",");
  226. queryWrapper.orderByDesc(Arrays.asList(columnArray));
  227. }
  228. //update-end--Author:scott Date:20210531 for:36 多条件排序无效问题修正-------
  229. }
  230. }
  231. /**
  232. * 高级查询
  233. * @param queryWrapper 查询对象
  234. * @param parameterMap 参数对象
  235. * @param fieldColumnMap 实体字段和数据库列对应的map
  236. */
  237. public static void doSuperQuery(QueryWrapper<?> queryWrapper,Map<String, String[]> parameterMap, Map<String,String> fieldColumnMap) {
  238. if(parameterMap!=null&& parameterMap.containsKey(SUPER_QUERY_PARAMS)){
  239. String superQueryParams = parameterMap.get(SUPER_QUERY_PARAMS)[0];
  240. String superQueryMatchType = parameterMap.get(SUPER_QUERY_MATCH_TYPE) != null ? parameterMap.get(SUPER_QUERY_MATCH_TYPE)[0] : MatchTypeEnum.AND.getValue();
  241. MatchTypeEnum matchType = MatchTypeEnum.getByValue(superQueryMatchType);
  242. // update-begin--Author:sunjianlei Date:20200325 for:高级查询的条件要用括号括起来,防止和用户的其他条件冲突 -------
  243. try {
  244. superQueryParams = URLDecoder.decode(superQueryParams, "UTF-8");
  245. List<QueryCondition> conditions = JSON.parseArray(superQueryParams, QueryCondition.class);
  246. if (conditions == null || conditions.size() == 0) {
  247. return;
  248. }
  249. log.info("---高级查询参数-->" + conditions.toString());
  250. queryWrapper.and(andWrapper -> {
  251. for (int i = 0; i < conditions.size(); i++) {
  252. QueryCondition rule = conditions.get(i);
  253. if (oConvertUtils.isNotEmpty(rule.getField())
  254. && oConvertUtils.isNotEmpty(rule.getRule())
  255. && oConvertUtils.isNotEmpty(rule.getVal())) {
  256. log.debug("SuperQuery ==> " + rule.toString());
  257. //update-begin-author:taoyan date:20201228 for: 【高级查询】 oracle 日期等于查询报错
  258. Object queryValue = rule.getVal();
  259. if("date".equals(rule.getType())){
  260. queryValue = DateUtils.str2Date(rule.getVal(),DateUtils.date_sdf.get());
  261. }else if("datetime".equals(rule.getType())){
  262. queryValue = DateUtils.str2Date(rule.getVal(), DateUtils.datetimeFormat.get());
  263. }
  264. // update-begin--author:sunjianlei date:20210702 for:【/issues/I3VR8E】高级查询没有类型转换,查询参数都是字符串类型 ----
  265. String dbType = rule.getDbType();
  266. if (oConvertUtils.isNotEmpty(dbType)) {
  267. try {
  268. String valueStr = String.valueOf(queryValue);
  269. switch (dbType.toLowerCase().trim()) {
  270. case "int":
  271. queryValue = Integer.parseInt(valueStr);
  272. break;
  273. case "bigdecimal":
  274. queryValue = new BigDecimal(valueStr);
  275. break;
  276. case "short":
  277. queryValue = Short.parseShort(valueStr);
  278. break;
  279. case "long":
  280. queryValue = Long.parseLong(valueStr);
  281. break;
  282. case "float":
  283. queryValue = Float.parseFloat(valueStr);
  284. break;
  285. case "double":
  286. queryValue = Double.parseDouble(valueStr);
  287. break;
  288. case "boolean":
  289. queryValue = Boolean.parseBoolean(valueStr);
  290. break;
  291. }
  292. } catch (Exception e) {
  293. log.error("高级查询值转换失败:", e);
  294. }
  295. }
  296. // update-begin--author:sunjianlei date:20210702 for:【/issues/I3VR8E】高级查询没有类型转换,查询参数都是字符串类型 ----
  297. addEasyQuery(andWrapper, fieldColumnMap.get(rule.getField()), QueryRuleEnum.getByValue(rule.getRule()), queryValue);
  298. //update-end-author:taoyan date:20201228 for: 【高级查询】 oracle 日期等于查询报错
  299. // 如果拼接方式是OR,就拼接OR
  300. if (MatchTypeEnum.OR == matchType && i < (conditions.size() - 1)) {
  301. andWrapper.or();
  302. }
  303. }
  304. }
  305. //return andWrapper;
  306. });
  307. } catch (UnsupportedEncodingException e) {
  308. log.error("--高级查询参数转码失败:" + superQueryParams, e);
  309. } catch (Exception e) {
  310. log.error("--高级查询拼接失败:" + e.getMessage());
  311. e.printStackTrace();
  312. }
  313. // update-end--Author:sunjianlei Date:20200325 for:高级查询的条件要用括号括起来,防止和用户的其他条件冲突 -------
  314. }
  315. //log.info(" superQuery getCustomSqlSegment: "+ queryWrapper.getCustomSqlSegment());
  316. }
  317. /**
  318. * 根据所传的值 转化成对应的比较方式
  319. * 支持><= like in !
  320. * @param value
  321. * @return
  322. */
  323. private static QueryRuleEnum convert2Rule(Object value) {
  324. // 避免空数据
  325. // update-begin-author:taoyan date:20210629 for: 查询条件输入空格导致return null后续判断导致抛出null异常
  326. if (value == null) {
  327. return QueryRuleEnum.EQ;
  328. }
  329. String val = (value + "").toString().trim();
  330. if (val.length() == 0) {
  331. return QueryRuleEnum.EQ;
  332. }
  333. // update-end-author:taoyan date:20210629 for: 查询条件输入空格导致return null后续判断导致抛出null异常
  334. QueryRuleEnum rule =null;
  335. //update-begin--Author:scott Date:20190724 for:initQueryWrapper组装sql查询条件错误 #284-------------------
  336. //TODO 此处规则,只适用于 le lt ge gt
  337. // step 2 .>= =<
  338. if (rule == null && val.length() >= 3) {
  339. if(QUERY_SEPARATE_KEYWORD.equals(val.substring(2, 3))){
  340. rule = QueryRuleEnum.getByValue(val.substring(0, 2));
  341. }
  342. }
  343. // step 1 .> <
  344. if (rule == null && val.length() >= 2) {
  345. if(QUERY_SEPARATE_KEYWORD.equals(val.substring(1, 2))){
  346. rule = QueryRuleEnum.getByValue(val.substring(0, 1));
  347. }
  348. }
  349. //update-end--Author:scott Date:20190724 for:initQueryWrapper组装sql查询条件错误 #284---------------------
  350. // step 3 like
  351. if (rule == null && val.contains(STAR)) {
  352. if (val.startsWith(STAR) && val.endsWith(STAR)) {
  353. rule = QueryRuleEnum.LIKE;
  354. } else if (val.startsWith(STAR)) {
  355. rule = QueryRuleEnum.LEFT_LIKE;
  356. } else if(val.endsWith(STAR)){
  357. rule = QueryRuleEnum.RIGHT_LIKE;
  358. }
  359. }
  360. // step 4 in
  361. if (rule == null && val.contains(COMMA)) {
  362. //TODO in 查询这里应该有个bug 如果一字段本身就是多选 此时用in查询 未必能查询出来
  363. rule = QueryRuleEnum.IN;
  364. }
  365. // step 5 !=
  366. if(rule == null && val.startsWith(NOT_EQUAL)){
  367. rule = QueryRuleEnum.NE;
  368. }
  369. // step 6 xx+xx+xx 这种情况适用于如果想要用逗号作精确查询 但是系统默认逗号走in 所以可以用++替换【此逻辑作废】
  370. if(rule == null && val.indexOf(QUERY_COMMA_ESCAPE)>0){
  371. rule = QueryRuleEnum.EQ_WITH_ADD;
  372. }
  373. //update-begin--Author:taoyan Date:20201229 for:initQueryWrapper组装sql查询条件错误 #284---------------------
  374. //特殊处理:Oracle的表达式to_date('xxx','yyyy-MM-dd')含有逗号,会被识别为in查询,转为等于查询
  375. if(rule == QueryRuleEnum.IN && val.indexOf("yyyy-MM-dd")>=0 && val.indexOf("to_date")>=0){
  376. rule = QueryRuleEnum.EQ;
  377. }
  378. //update-end--Author:taoyan Date:20201229 for:initQueryWrapper组装sql查询条件错误 #284---------------------
  379. return rule != null ? rule : QueryRuleEnum.EQ;
  380. }
  381. /**
  382. * 替换掉关键字字符
  383. *
  384. * @param rule
  385. * @param value
  386. * @return
  387. */
  388. private static Object replaceValue(QueryRuleEnum rule, Object value) {
  389. if (rule == null) {
  390. return null;
  391. }
  392. if (! (value instanceof String)){
  393. return value;
  394. }
  395. String val = (value + "").toString().trim();
  396. if (rule == QueryRuleEnum.LIKE) {
  397. value = val.substring(1, val.length() - 1);
  398. //mysql 模糊查询之特殊字符下划线 (_、\)
  399. value = specialStrConvert(value.toString());
  400. } else if (rule == QueryRuleEnum.LEFT_LIKE || rule == QueryRuleEnum.NE) {
  401. value = val.substring(1);
  402. //mysql 模糊查询之特殊字符下划线 (_、\)
  403. value = specialStrConvert(value.toString());
  404. } else if (rule == QueryRuleEnum.RIGHT_LIKE) {
  405. value = val.substring(0, val.length() - 1);
  406. //mysql 模糊查询之特殊字符下划线 (_、\)
  407. value = specialStrConvert(value.toString());
  408. } else if (rule == QueryRuleEnum.IN) {
  409. value = val.split(",");
  410. } else if (rule == QueryRuleEnum.EQ_WITH_ADD) {
  411. value = val.replaceAll("\\+\\+", COMMA);
  412. }else {
  413. //update-begin--Author:scott Date:20190724 for:initQueryWrapper组装sql查询条件错误 #284-------------------
  414. if(val.startsWith(rule.getValue())){
  415. //TODO 此处逻辑应该注释掉-> 如果查询内容中带有查询匹配规则符号,就会被截取的(比如:>=您好)
  416. value = val.replaceFirst(rule.getValue(),"");
  417. }else if(val.startsWith(rule.getCondition()+QUERY_SEPARATE_KEYWORD)){
  418. value = val.replaceFirst(rule.getCondition()+QUERY_SEPARATE_KEYWORD,"").trim();
  419. }
  420. //update-end--Author:scott Date:20190724 for:initQueryWrapper组装sql查询条件错误 #284-------------------
  421. }
  422. return value;
  423. }
  424. private static void addQueryByRule(QueryWrapper<?> queryWrapper,String name,String type,String value,QueryRuleEnum rule) throws ParseException {
  425. if(oConvertUtils.isNotEmpty(value)) {
  426. Object temp;
  427. // 针对数字类型字段,多值查询
  428. if(value.indexOf(COMMA)!=-1){
  429. temp = value;
  430. addEasyQuery(queryWrapper, name, rule, temp);
  431. return;
  432. }
  433. switch (type) {
  434. case "class java.lang.Integer":
  435. temp = Integer.parseInt(value);
  436. break;
  437. case "class java.math.BigDecimal":
  438. temp = new BigDecimal(value);
  439. break;
  440. case "class java.lang.Short":
  441. temp = Short.parseShort(value);
  442. break;
  443. case "class java.lang.Long":
  444. temp = Long.parseLong(value);
  445. break;
  446. case "class java.lang.Float":
  447. temp = Float.parseFloat(value);
  448. break;
  449. case "class java.lang.Double":
  450. temp = Double.parseDouble(value);
  451. break;
  452. case "class java.util.Date":
  453. temp = getDateQueryByRule(value, rule);
  454. break;
  455. default:
  456. temp = value;
  457. break;
  458. }
  459. addEasyQuery(queryWrapper, name, rule, temp);
  460. }
  461. }
  462. /**
  463. * 获取日期类型的值
  464. * @param value
  465. * @param rule
  466. * @return
  467. * @throws ParseException
  468. */
  469. private static Date getDateQueryByRule(String value,QueryRuleEnum rule) throws ParseException {
  470. Date date = null;
  471. if(value.length()==10) {
  472. if(rule==QueryRuleEnum.GE) {
  473. //比较大于
  474. date = getTime().parse(value + " 00:00:00");
  475. }else if(rule==QueryRuleEnum.LE) {
  476. //比较小于
  477. date = getTime().parse(value + " 23:59:59");
  478. }
  479. //TODO 日期类型比较特殊 可能oracle下不一定好使
  480. }
  481. if(date==null) {
  482. date = getTime().parse(value);
  483. }
  484. return date;
  485. }
  486. /**
  487. * 根据规则走不同的查询
  488. * @param queryWrapper QueryWrapper
  489. * @param name 字段名字
  490. * @param rule 查询规则
  491. * @param value 查询条件值
  492. */
  493. private static void addEasyQuery(QueryWrapper<?> queryWrapper, String name, QueryRuleEnum rule, Object value) {
  494. if (value == null || rule == null || oConvertUtils.isEmpty(value)) {
  495. return;
  496. }
  497. name = oConvertUtils.camelToUnderline(name);
  498. log.info("--查询规则-->"+name+" "+rule.getValue()+" "+value);
  499. switch (rule) {
  500. case GT:
  501. queryWrapper.gt(name, value);
  502. break;
  503. case GE:
  504. queryWrapper.ge(name, value);
  505. break;
  506. case LT:
  507. queryWrapper.lt(name, value);
  508. break;
  509. case LE:
  510. queryWrapper.le(name, value);
  511. break;
  512. case EQ:
  513. case EQ_WITH_ADD:
  514. queryWrapper.eq(name, value);
  515. break;
  516. case NE:
  517. queryWrapper.ne(name, value);
  518. break;
  519. case IN:
  520. if(value instanceof String) {
  521. queryWrapper.in(name, (Object[])value.toString().split(","));
  522. }else if(value instanceof String[]) {
  523. queryWrapper.in(name, (Object[]) value);
  524. }
  525. //update-begin-author:taoyan date:20200909 for:【bug】in 类型多值查询 不适配postgresql #1671
  526. else if(value.getClass().isArray()) {
  527. queryWrapper.in(name, (Object[])value);
  528. }else {
  529. queryWrapper.in(name, value);
  530. }
  531. //update-end-author:taoyan date:20200909 for:【bug】in 类型多值查询 不适配postgresql #1671
  532. break;
  533. case LIKE:
  534. queryWrapper.like(name, value);
  535. break;
  536. case LEFT_LIKE:
  537. queryWrapper.likeLeft(name, value);
  538. break;
  539. case RIGHT_LIKE:
  540. queryWrapper.likeRight(name, value);
  541. break;
  542. default:
  543. log.info("--查询规则未匹配到---");
  544. break;
  545. }
  546. }
  547. /**
  548. *
  549. * @param name
  550. * @return
  551. */
  552. private static boolean judgedIsUselessField(String name) {
  553. return "class".equals(name) || "ids".equals(name)
  554. || "page".equals(name) || "rows".equals(name)
  555. || "sort".equals(name) || "order".equals(name);
  556. }
  557. /**
  558. * 获取请求对应的数据权限规则
  559. * @return
  560. */
  561. public static Map<String, SysPermissionDataRuleModel> getRuleMap() {
  562. Map<String, SysPermissionDataRuleModel> ruleMap = new HashMap<String, SysPermissionDataRuleModel>();
  563. List<SysPermissionDataRuleModel> list =JeecgDataAutorUtils.loadDataSearchConditon();
  564. if(list != null&&list.size()>0){
  565. if(list.get(0)==null){
  566. return ruleMap;
  567. }
  568. for (SysPermissionDataRuleModel rule : list) {
  569. String column = rule.getRuleColumn();
  570. if(QueryRuleEnum.SQL_RULES.getValue().equals(rule.getRuleConditions())) {
  571. column = SQL_RULES_COLUMN+rule.getId();
  572. }
  573. ruleMap.put(column, rule);
  574. }
  575. }
  576. return ruleMap;
  577. }
  578. /**
  579. * 获取请求对应的数据权限规则
  580. * @return
  581. */
  582. public static Map<String, SysPermissionDataRuleModel> getRuleMap(List<SysPermissionDataRuleModel> list) {
  583. Map<String, SysPermissionDataRuleModel> ruleMap = new HashMap<String, SysPermissionDataRuleModel>();
  584. if(list==null){
  585. list =JeecgDataAutorUtils.loadDataSearchConditon();
  586. }
  587. if(list != null&&list.size()>0){
  588. if(list.get(0)==null){
  589. return ruleMap;
  590. }
  591. for (SysPermissionDataRuleModel rule : list) {
  592. String column = rule.getRuleColumn();
  593. if(QueryRuleEnum.SQL_RULES.getValue().equals(rule.getRuleConditions())) {
  594. column = SQL_RULES_COLUMN+rule.getId();
  595. }
  596. ruleMap.put(column, rule);
  597. }
  598. }
  599. return ruleMap;
  600. }
  601. private static void addRuleToQueryWrapper(SysPermissionDataRuleModel dataRule, String name, Class propertyType, QueryWrapper<?> queryWrapper) {
  602. QueryRuleEnum rule = QueryRuleEnum.getByValue(dataRule.getRuleConditions());
  603. if(rule.equals(QueryRuleEnum.IN) && ! propertyType.equals(String.class)) {
  604. String[] values = dataRule.getRuleValue().split(",");
  605. Object[] objs = new Object[values.length];
  606. for (int i = 0; i < values.length; i++) {
  607. objs[i] = NumberUtils.parseNumber(values[i], propertyType);
  608. }
  609. addEasyQuery(queryWrapper, name, rule, objs);
  610. }else {
  611. if (propertyType.equals(String.class)) {
  612. addEasyQuery(queryWrapper, name, rule, converRuleValue(dataRule.getRuleValue()));
  613. }else if (propertyType.equals(Date.class)) {
  614. String dateStr =converRuleValue(dataRule.getRuleValue());
  615. if(dateStr.length()==10){
  616. addEasyQuery(queryWrapper, name, rule, DateUtils.str2Date(dateStr,DateUtils.date_sdf.get()));
  617. }else{
  618. addEasyQuery(queryWrapper, name, rule, DateUtils.str2Date(dateStr,DateUtils.datetimeFormat.get()));
  619. }
  620. }else {
  621. addEasyQuery(queryWrapper, name, rule, NumberUtils.parseNumber(dataRule.getRuleValue(), propertyType));
  622. }
  623. }
  624. }
  625. public static String converRuleValue(String ruleValue) {
  626. String value = JwtUtil.getUserSystemData(ruleValue,null);
  627. return value!= null ? value : ruleValue;
  628. }
  629. /**
  630. * @author: scott
  631. * @Description: 去掉值前后单引号
  632. * @date: 2020/3/19 21:26
  633. * @param ruleValue:
  634. * @Return: java.lang.String
  635. */
  636. public static String trimSingleQuote(String ruleValue) {
  637. if (oConvertUtils.isEmpty(ruleValue)) {
  638. return "";
  639. }
  640. if (ruleValue.startsWith(QueryGenerator.SQL_SQ)) {
  641. ruleValue = ruleValue.substring(1);
  642. }
  643. if (ruleValue.endsWith(QueryGenerator.SQL_SQ)) {
  644. ruleValue = ruleValue.substring(0, ruleValue.length() - 1);
  645. }
  646. return ruleValue;
  647. }
  648. public static String getSqlRuleValue(String sqlRule){
  649. try {
  650. Set<String> varParams = getSqlRuleParams(sqlRule);
  651. for(String var:varParams){
  652. String tempValue = converRuleValue(var);
  653. sqlRule = sqlRule.replace("#{"+var+"}",tempValue);
  654. }
  655. } catch (Exception e) {
  656. log.error(e.getMessage(), e);
  657. }
  658. return sqlRule;
  659. }
  660. /**
  661. * 获取sql中的#{key} 这个key组成的set
  662. */
  663. public static Set<String> getSqlRuleParams(String sql) {
  664. if(oConvertUtils.isEmpty(sql)){
  665. return null;
  666. }
  667. Set<String> varParams = new HashSet<String>();
  668. String regex = "\\#\\{\\w+\\}";
  669. Pattern p = Pattern.compile(regex);
  670. Matcher m = p.matcher(sql);
  671. while(m.find()){
  672. String var = m.group();
  673. varParams.add(var.substring(var.indexOf("{")+1,var.indexOf("}")));
  674. }
  675. return varParams;
  676. }
  677. /**
  678. * 获取查询条件
  679. * @param field
  680. * @param alias
  681. * @param value
  682. * @param isString
  683. * @return
  684. */
  685. public static String getSingleQueryConditionSql(String field,String alias,Object value,boolean isString) {
  686. return getSingleQueryConditionSql(field, alias, value, isString,null);
  687. }
  688. /**
  689. * 报表获取查询条件 支持多数据源
  690. * @param field
  691. * @param alias
  692. * @param value
  693. * @param isString
  694. * @param dataBaseType
  695. * @return
  696. */
  697. public static String getSingleQueryConditionSql(String field,String alias,Object value,boolean isString, String dataBaseType) {
  698. if (value == null) {
  699. return "";
  700. }
  701. field = alias+oConvertUtils.camelToUnderline(field);
  702. QueryRuleEnum rule = QueryGenerator.convert2Rule(value);
  703. return getSingleSqlByRule(rule, field, value, isString, dataBaseType);
  704. }
  705. /**
  706. * 获取单个查询条件的值
  707. * @param rule
  708. * @param field
  709. * @param value
  710. * @param isString
  711. * @param dataBaseType
  712. * @return
  713. */
  714. public static String getSingleSqlByRule(QueryRuleEnum rule,String field,Object value,boolean isString, String dataBaseType) {
  715. String res = "";
  716. switch (rule) {
  717. case GT:
  718. res =field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType);
  719. break;
  720. case GE:
  721. res = field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType);
  722. break;
  723. case LT:
  724. res = field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType);
  725. break;
  726. case LE:
  727. res = field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType);
  728. break;
  729. case EQ:
  730. res = field+rule.getValue()+getFieldConditionValue(value, isString, dataBaseType);
  731. break;
  732. case EQ_WITH_ADD:
  733. res = field+" = "+getFieldConditionValue(value, isString, dataBaseType);
  734. break;
  735. case NE:
  736. res = field+" <> "+getFieldConditionValue(value, isString, dataBaseType);
  737. break;
  738. case IN:
  739. res = field + " in "+getInConditionValue(value, isString);
  740. break;
  741. case LIKE:
  742. res = field + " like "+getLikeConditionValue(value);
  743. break;
  744. case LEFT_LIKE:
  745. res = field + " like "+getLikeConditionValue(value);
  746. break;
  747. case RIGHT_LIKE:
  748. res = field + " like "+getLikeConditionValue(value);
  749. break;
  750. default:
  751. res = field+" = "+getFieldConditionValue(value, isString, dataBaseType);
  752. break;
  753. }
  754. return res;
  755. }
  756. /**
  757. * 获取单个查询条件的值
  758. * @param rule
  759. * @param field
  760. * @param value
  761. * @param isString
  762. * @return
  763. */
  764. public static String getSingleSqlByRule(QueryRuleEnum rule,String field,Object value,boolean isString) {
  765. return getSingleSqlByRule(rule, field, value, isString, null);
  766. }
  767. /**
  768. * 获取查询条件的值
  769. * @param value
  770. * @param isString
  771. * @param dataBaseType
  772. * @return
  773. */
  774. private static String getFieldConditionValue(Object value,boolean isString, String dataBaseType) {
  775. String str = value.toString().trim();
  776. if(str.startsWith("!")) {
  777. str = str.substring(1);
  778. }else if(str.startsWith(">=")) {
  779. str = str.substring(2);
  780. }else if(str.startsWith("<=")) {
  781. str = str.substring(2);
  782. }else if(str.startsWith(">")) {
  783. str = str.substring(1);
  784. }else if(str.startsWith("<")) {
  785. str = str.substring(1);
  786. }else if(str.indexOf(QUERY_COMMA_ESCAPE)>0) {
  787. str = str.replaceAll("\\+\\+", COMMA);
  788. }
  789. if(dataBaseType==null){
  790. dataBaseType = getDbType();
  791. }
  792. if(isString) {
  793. if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(dataBaseType)){
  794. return " N'"+str+"' ";
  795. }else{
  796. return " '"+str+"' ";
  797. }
  798. }else {
  799. // 如果不是字符串 有一种特殊情况 popup调用都走这个逻辑 参数传递的可能是“‘admin’”这种格式的
  800. if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(dataBaseType) && str.endsWith("'") && str.startsWith("'")){
  801. return " N"+str;
  802. }
  803. return value.toString();
  804. }
  805. }
  806. private static String getInConditionValue(Object value,boolean isString) {
  807. //update-begin-author:taoyan date:20210628 for: 查询条件如果输入,导致sql报错
  808. String[] temp = value.toString().split(",");
  809. if(temp.length==0){
  810. return "('')";
  811. }
  812. if(isString) {
  813. List<String> res = new ArrayList<>();
  814. for (String string : temp) {
  815. if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){
  816. res.add("N'"+string+"'");
  817. }else{
  818. res.add("'"+string+"'");
  819. }
  820. }
  821. return "("+String.join("," ,res)+")";
  822. }else {
  823. return "("+value.toString()+")";
  824. }
  825. //update-end-author:taoyan date:20210628 for: 查询条件如果输入,导致sql报错
  826. }
  827. private static String getLikeConditionValue(Object value) {
  828. String str = value.toString().trim();
  829. if(str.startsWith("*") && str.endsWith("*")) {
  830. if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){
  831. return "N'%"+str.substring(1,str.length()-1)+"%'";
  832. }else{
  833. return "'%"+str.substring(1,str.length()-1)+"%'";
  834. }
  835. }else if(str.startsWith("*")) {
  836. if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){
  837. return "N'%"+str.substring(1)+"'";
  838. }else{
  839. return "'%"+str.substring(1)+"'";
  840. }
  841. }else if(str.endsWith("*")) {
  842. if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){
  843. return "N'"+str.substring(0,str.length()-1)+"%'";
  844. }else{
  845. return "'"+str.substring(0,str.length()-1)+"%'";
  846. }
  847. }else {
  848. if(str.indexOf("%")>=0) {
  849. if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){
  850. if(str.startsWith("'") && str.endsWith("'")){
  851. return "N"+str;
  852. }else{
  853. return "N"+"'"+str+"'";
  854. }
  855. }else{
  856. if(str.startsWith("'") && str.endsWith("'")){
  857. return str;
  858. }else{
  859. return "'"+str+"'";
  860. }
  861. }
  862. }else {
  863. if(DataBaseConstant.DB_TYPE_SQLSERVER.equals(getDbType())){
  864. return "N'%"+str+"%'";
  865. }else{
  866. return "'%"+str+"%'";
  867. }
  868. }
  869. }
  870. }
  871. /**
  872. * 根据权限相关配置生成相关的SQL 语句
  873. * @param clazz
  874. * @return
  875. */
  876. @SuppressWarnings({ "unchecked", "rawtypes" })
  877. public static String installAuthJdbc(Class<?> clazz) {
  878. StringBuffer sb = new StringBuffer();
  879. //权限查询
  880. Map<String,SysPermissionDataRuleModel> ruleMap = getRuleMap();
  881. PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(clazz);
  882. String sql_and = " and ";
  883. for (String c : ruleMap.keySet()) {
  884. if(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){
  885. sb.append(sql_and+getSqlRuleValue(ruleMap.get(c).getRuleValue()));
  886. }
  887. }
  888. String name, column;
  889. for (int i = 0; i < origDescriptors.length; i++) {
  890. name = origDescriptors[i].getName();
  891. if (judgedIsUselessField(name)) {
  892. continue;
  893. }
  894. if(ruleMap.containsKey(name)) {
  895. column = getTableFieldName(clazz, name);
  896. if(column==null){
  897. continue;
  898. }
  899. SysPermissionDataRuleModel dataRule = ruleMap.get(name);
  900. QueryRuleEnum rule = QueryRuleEnum.getByValue(dataRule.getRuleConditions());
  901. Class propType = origDescriptors[i].getPropertyType();
  902. boolean isString = propType.equals(String.class);
  903. Object value;
  904. if(isString) {
  905. value = converRuleValue(dataRule.getRuleValue());
  906. }else {
  907. value = NumberUtils.parseNumber(dataRule.getRuleValue(),propType);
  908. }
  909. String filedSql = getSingleSqlByRule(rule, oConvertUtils.camelToUnderline(column), value,isString);
  910. sb.append(sql_and+filedSql);
  911. }
  912. }
  913. log.info("query auth sql is:"+sb.toString());
  914. return sb.toString();
  915. }
  916. /**
  917. * 根据权限相关配置 组装mp需要的权限
  918. * @param queryWrapper
  919. * @param clazz
  920. * @return
  921. */
  922. public static void installAuthMplus(QueryWrapper<?> queryWrapper,Class<?> clazz) {
  923. //权限查询
  924. Map<String,SysPermissionDataRuleModel> ruleMap = getRuleMap();
  925. PropertyDescriptor origDescriptors[] = PropertyUtils.getPropertyDescriptors(clazz);
  926. for (String c : ruleMap.keySet()) {
  927. if(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){
  928. queryWrapper.and(i ->i.apply(getSqlRuleValue(ruleMap.get(c).getRuleValue())));
  929. }
  930. }
  931. String name, column;
  932. for (int i = 0; i < origDescriptors.length; i++) {
  933. name = origDescriptors[i].getName();
  934. if (judgedIsUselessField(name)) {
  935. continue;
  936. }
  937. column = getTableFieldName(clazz, name);
  938. if(column==null){
  939. continue;
  940. }
  941. if(ruleMap.containsKey(name)) {
  942. addRuleToQueryWrapper(ruleMap.get(name), column, origDescriptors[i].getPropertyType(), queryWrapper);
  943. }
  944. }
  945. }
  946. /**
  947. * 转换sql中的系统变量
  948. * @param sql
  949. * @return
  950. */
  951. public static String convertSystemVariables(String sql){
  952. return getSqlRuleValue(sql);
  953. }
  954. /**
  955. * 获取所有配置的权限 返回sql字符串 不受字段限制 配置什么就拿到什么
  956. * @return
  957. */
  958. public static String getAllConfigAuth() {
  959. StringBuffer sb = new StringBuffer();
  960. //权限查询
  961. Map<String,SysPermissionDataRuleModel> ruleMap = getRuleMap();
  962. String sql_and = " and ";
  963. for (String c : ruleMap.keySet()) {
  964. SysPermissionDataRuleModel dataRule = ruleMap.get(c);
  965. String ruleValue = dataRule.getRuleValue();
  966. if(oConvertUtils.isEmpty(ruleValue)){
  967. continue;
  968. }
  969. if(oConvertUtils.isNotEmpty(c) && c.startsWith(SQL_RULES_COLUMN)){
  970. sb.append(sql_and+getSqlRuleValue(ruleValue));
  971. }else{
  972. boolean isString = false;
  973. ruleValue = ruleValue.trim();
  974. if(ruleValue.startsWith("'") && ruleValue.endsWith("'")){
  975. isString = true;
  976. ruleValue = ruleValue.substring(1,ruleValue.length()-1);
  977. }
  978. QueryRuleEnum rule = QueryRuleEnum.getByValue(dataRule.getRuleConditions());
  979. String value = converRuleValue(ruleValue);
  980. String filedSql = getSingleSqlByRule(rule, c, value,isString);
  981. sb.append(sql_and+filedSql);
  982. }
  983. }
  984. log.info("query auth sql is = "+sb.toString());
  985. return sb.toString();
  986. }
  987. /**
  988. * 获取系统数据库类型
  989. */
  990. private static String getDbType(){
  991. return CommonUtils.getDatabaseType();
  992. }
  993. /**
  994. * 获取class的 包括父类的
  995. * @param clazz
  996. * @return
  997. */
  998. private static List<Field> getClassFields(Class<?> clazz) {
  999. List<Field> list = new ArrayList<Field>();
  1000. Field[] fields;
  1001. do{
  1002. fields = clazz.getDeclaredFields();
  1003. for(int i = 0;i<fields.length;i++){
  1004. list.add(fields[i]);
  1005. }
  1006. clazz = clazz.getSuperclass();
  1007. }while(clazz!= Object.class&&clazz!=null);
  1008. return list;
  1009. }
  1010. /**
  1011. * 获取表字段名
  1012. * @param clazz
  1013. * @param name
  1014. * @return
  1015. */
  1016. private static String getTableFieldName(Class<?> clazz, String name) {
  1017. try {
  1018. //如果字段加注解了@TableField(exist = false),不走DB查询
  1019. Field field = null;
  1020. try {
  1021. field = clazz.getDeclaredField(name);
  1022. } catch (NoSuchFieldException e) {
  1023. //e.printStackTrace();
  1024. }
  1025. //如果为空,则去父类查找字段
  1026. if (field == null) {
  1027. List<Field> allFields = getClassFields(clazz);
  1028. List<Field> searchFields = allFields.stream().filter(a -> a.getName().equals(name)).collect(Collectors.toList());
  1029. if(searchFields!=null && searchFields.size()>0){
  1030. field = searchFields.get(0);
  1031. }
  1032. }
  1033. if (field != null) {
  1034. TableField tableField = field.getAnnotation(TableField.class);
  1035. if (tableField != null){
  1036. if(tableField.exist() == false){
  1037. //如果设置了TableField false 这个字段不需要处理
  1038. return null;
  1039. }else{
  1040. String column = tableField.value();
  1041. //如果设置了TableField value 这个字段是实体字段
  1042. if(!"".equals(column)){
  1043. return column;
  1044. }
  1045. }
  1046. }
  1047. }
  1048. } catch (Exception e) {
  1049. e.printStackTrace();
  1050. }
  1051. return name;
  1052. }
  1053. /**
  1054. * mysql 模糊查询之特殊字符下划线 (_、\)
  1055. *
  1056. * @param value:
  1057. * @Return: java.lang.String
  1058. */
  1059. private static String specialStrConvert(String value) {
  1060. if (DataBaseConstant.DB_TYPE_MYSQL.equals(getDbType()) || DataBaseConstant.DB_TYPE_MARIADB.equals(getDbType())) {
  1061. String[] special_str = QueryGenerator.LIKE_MYSQL_SPECIAL_STRS.split(",");
  1062. for (String str : special_str) {
  1063. if (value.indexOf(str) !=-1) {
  1064. value = value.replace(str, "\\" + str);
  1065. }
  1066. }
  1067. }
  1068. return value;
  1069. }
  1070. }