QueryWrapperUtil.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. package me.zhengjie.base.plus;
  2. import java.lang.reflect.Field;
  3. import java.lang.reflect.Method;
  4. import java.util.ArrayList;
  5. import java.util.Arrays;
  6. import java.util.List;
  7. import org.apache.commons.lang3.ArrayUtils;
  8. import org.springframework.core.annotation.AnnotationUtils;
  9. import org.springframework.util.ObjectUtils;
  10. import org.springframework.util.ReflectionUtils;
  11. import com.alibaba.fastjson.JSONObject;
  12. import com.baomidou.mybatisplus.annotation.TableField;
  13. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  14. import me.zhengjie.dao.mybatis.entity.ContractOrderEntity;
  15. /**
  16. * @Description 拼接查询条件工具类
  17. */
  18. public class QueryWrapperUtil {
  19. /**
  20. * 得到父类的对象
  21. *
  22. * @param <T> 查询的泛型
  23. * @param clazz
  24. * @return
  25. */
  26. public static <T> List<Field> reflectForField(Class<T> clazz) {
  27. Class<?> tmpClazz = clazz;
  28. List<Field> fieldList = new ArrayList<>();
  29. while (tmpClazz != null) {
  30. fieldList.addAll(Arrays.asList(tmpClazz.getDeclaredFields()));
  31. tmpClazz = tmpClazz.getSuperclass();
  32. }
  33. return fieldList;
  34. }
  35. /**
  36. * 拼接查询条件
  37. *
  38. * @param obj 数据实体
  39. * @return void 返回参数说明
  40. * @exception/throws
  41. */
  42. public static <T> QueryWrapper<T> convertQuery(Object obj, JSONObject... jsonObj) {
  43. JSONObject param = new JSONObject();
  44. if (ArrayUtils.isNotEmpty(jsonObj)) {
  45. param = jsonObj[0];
  46. }
  47. QueryWrapper<T> queryWrapper = new QueryWrapper<>();
  48. Class<?> clazz = obj.getClass();
  49. try {
  50. // TODO 这里应该通过共有方法来进行反射
  51. for (Field field : reflectForField(clazz)) {
  52. // 抑制Java对修饰符的检查
  53. // field.setAccessible(true);
  54. // 获取属性值
  55. // Object fieldValue = field.get(obj);
  56. // String fieldValue = getFieldValue(obj ,field.getName()).toString();
  57. TableField tableField = AnnotationUtils.getAnnotation(field, TableField.class);
  58. // 字段没有TableField这个注解和有这个主机上false的
  59. if (ObjectUtils.isEmpty(tableField) || !tableField.exist()) {
  60. continue;
  61. }
  62. // String methodName = "set" + filedName.substring(0, 1).toUpperCase() +
  63. // filedName.substring(1);
  64. // 获取属性名
  65. String name = field.getName();
  66. // 声明属性描述对象
  67. // PropertyDescriptor propertyDescriptor = new PropertyDescriptor(name, clazz);
  68. // Method method = clazz.getDeclaredMethod(propertyName);
  69. // 获取getter方法
  70. // Method method = propertyDescriptor.getReadMethod();
  71. String getMethod = getMethod(name);
  72. Method method = ReflectionUtils.findMethod(clazz, getMethod);
  73. Object fieldValue = method.invoke(obj);
  74. String fieldName = tableField.value();
  75. // 默认是相等
  76. QueryWapper queryWapperAnnotation = AnnotationUtils.getAnnotation(field, QueryWapper.class);
  77. if (ObjectUtils.isEmpty(queryWapperAnnotation)) {
  78. queryWrapper.eq(!ObjectUtils.isEmpty(fieldValue), fieldName, fieldValue);
  79. } else {
  80. // 获取枚举
  81. QueryKeyword[] queryWapperEnums = queryWapperAnnotation.value();
  82. for (QueryKeyword queryWapperEnum : queryWapperEnums) {
  83. // 拼接查询条件
  84. switch (queryWapperEnum) {
  85. case NE:
  86. queryWrapper.ne(!ObjectUtils.isEmpty(fieldValue), fieldName, fieldValue);
  87. break;
  88. // 这里需要,修改为集合
  89. case IN:
  90. if (fieldValue != null && fieldValue.toString().contains(",")) {
  91. List<String> result = Arrays.asList(fieldValue.toString().split(","));
  92. queryWrapper.in(!ObjectUtils.isEmpty(fieldValue), fieldName, result);
  93. }
  94. break;
  95. case GT:
  96. queryWrapper.gt(!ObjectUtils.isEmpty(fieldValue), fieldName, fieldValue);
  97. break;
  98. case GE:
  99. queryWrapper.ge(!ObjectUtils.isEmpty(fieldValue), fieldName, fieldValue);
  100. break;
  101. case LT:
  102. queryWrapper.lt(!ObjectUtils.isEmpty(fieldValue), fieldName, fieldValue);
  103. break;
  104. case LE:
  105. queryWrapper.le(!ObjectUtils.isEmpty(fieldValue), fieldName, fieldValue);
  106. break;
  107. case LIKE:
  108. queryWrapper.like(!ObjectUtils.isEmpty(fieldValue), fieldName, fieldValue);
  109. break;
  110. case NOT_LIKE:
  111. queryWrapper.notLike(!ObjectUtils.isEmpty(fieldValue), fieldName, fieldValue);
  112. break;
  113. case LIKE_LEFT:
  114. queryWrapper.likeLeft(!ObjectUtils.isEmpty(fieldValue), fieldName, fieldValue);
  115. break;
  116. case LIKE_RIGHT:
  117. queryWrapper.likeRight(!ObjectUtils.isEmpty(fieldValue), fieldName, fieldValue);
  118. break;
  119. case DESC:
  120. queryWrapper.orderByDesc(fieldName);
  121. break;
  122. case ASC:
  123. queryWrapper.orderByAsc(fieldName);
  124. break;
  125. case RANGE:
  126. // 设置开始的值和结束的值
  127. String[] attribute = queryWapperAnnotation.attribute();
  128. String startRange = attribute[0];
  129. // 声明属性描述对象
  130. getMethod = getMethod(startRange);
  131. method = ReflectionUtils.findMethod(clazz, getMethod);
  132. if (method != null) {
  133. Object val = method.invoke(obj);
  134. if (!ObjectUtils.isEmpty(val)) {
  135. queryWrapper.ge(fieldName, val);
  136. }
  137. }
  138. // 得到开始的属性值,通过反射设置属性值
  139. // Field startRange = clazz.getDeclaredField(attribute[0]);
  140. // startRange.setAccessible(true);
  141. // Object val = startRange.get(obj);
  142. // 结束的属性值,通过反射设置属性值
  143. String endRange = attribute[1];
  144. getMethod = getMethod(endRange);
  145. // 获取getter方法
  146. method = ReflectionUtils.findMethod(clazz, getMethod);
  147. if (method != null) {
  148. Object val = method.invoke(obj);
  149. if (!ObjectUtils.isEmpty(val)) {
  150. queryWrapper.le(fieldName, val);
  151. }
  152. }
  153. // ---属性值查询结束的值----
  154. // 通过传入的参数查询值
  155. // 然后通过参数查询
  156. Object val = param.get(attribute[0]);
  157. if (!ObjectUtils.isEmpty(val)) {
  158. queryWrapper.ge(fieldName, val);
  159. }
  160. // 然后通过参数查询
  161. val = param.get(attribute[1]);
  162. if (!ObjectUtils.isEmpty(val)) {
  163. queryWrapper.le(fieldName, val);
  164. }
  165. break;
  166. default:
  167. break;
  168. }
  169. }
  170. }
  171. }
  172. } catch (Exception e) {
  173. e.printStackTrace();
  174. }
  175. return queryWrapper;
  176. }
  177. public static String setMethod(String filedName) {
  178. String alpha = filedName.substring(0, 1).toUpperCase();
  179. String methodName = "set" + alpha + filedName.substring(1);
  180. return methodName;
  181. }
  182. public static String getMethod(String filedName) {
  183. String alpha = filedName.substring(0, 1).toUpperCase();
  184. String methodName = "get" + alpha + filedName.substring(1);
  185. return methodName;
  186. }
  187. /**
  188. * 获取属性名
  189. *
  190. * @exception/throws
  191. */
  192. // private static String getFieldValue(Object owner, String fieldName) {
  193. // try {
  194. // return invokeMethod(owner, fieldName, null).toString();
  195. // } catch (Exception e) {
  196. // e.printStackTrace();
  197. // }
  198. // return null;
  199. // }
  200. public static void main(String[] args) {
  201. ContractOrderEntity cc = new ContractOrderEntity();
  202. // cc.setStartDatea("fdsafdsa");
  203. // convertQuery(cc);
  204. Method m = ReflectionUtils.findMethod(ContractOrderEntity.class, "f");
  205. System.out.println(m);
  206. }
  207. }