/**
|
* Copyright (C) 2018-2022
|
* All rights reserved, Designed By www.yixiang.co
|
* 注意:
|
* 本软件为www.yixiang.co开发研制
|
*/
|
package com.gkhy.safePlatform.targetDuty.utils;
|
|
import com.alibaba.nacos.common.utils.CollectionUtils;
|
import com.alibaba.nacos.common.utils.StringUtils;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.gkhy.safePlatform.targetDuty.annotation.Query;
|
|
import java.lang.reflect.Field;
|
import java.text.SimpleDateFormat;
|
import java.util.ArrayList;
|
import java.util.Arrays;
|
import java.util.Collection;
|
import java.util.List;
|
|
/**
|
*/
|
@SuppressWarnings({"unchecked", "all"})
|
public class QueryHelpPlus {
|
|
public static <R, Q> QueryWrapper getPredicate(R obj, Q query) {
|
QueryWrapper<R> queryWrapper = new QueryWrapper<R>();
|
if (query == null) {
|
return queryWrapper;
|
}
|
try {
|
List<Field> fields = getAllFields(query.getClass(), new ArrayList<>());
|
for (Field field : fields) {
|
boolean accessible = field.isAccessible();
|
field.setAccessible(true);
|
Query q = field.getAnnotation(Query.class);
|
if (q != null) {
|
String propName = q.propName();
|
String blurry = q.blurry();
|
String attributeName = isBlank(propName) ? field.getName() : propName;
|
attributeName = humpToUnderline(attributeName);
|
Class<?> fieldType = field.getType();
|
Object val = field.get(query);
|
if (val == null || "".equals(val)) {
|
continue;
|
}
|
// 模糊多字段
|
if ( StringUtils.hasText(blurry)) {
|
String[] blurrys = blurry.split(",");
|
//queryWrapper.or();
|
queryWrapper.and(wrapper -> {
|
for (int i = 0; i < blurrys.length; i++) {
|
String column = humpToUnderline(blurrys[i]);
|
//if(i!=0){
|
wrapper.or();
|
//}
|
wrapper.like(column, val.toString());
|
}
|
});
|
continue;
|
}
|
String finalAttributeName = attributeName;
|
switch (q.type()) {
|
case EQUAL:
|
//queryWrapper.and(wrapper -> wrapper.eq(finalAttributeName, val));
|
queryWrapper.eq(attributeName, val);
|
break;
|
case GREATER_THAN:
|
queryWrapper.ge(finalAttributeName, val);
|
break;
|
case LESS_THAN:
|
queryWrapper.le(finalAttributeName, val);
|
break;
|
case LESS_THAN_NQ:
|
queryWrapper.lt(finalAttributeName, val);
|
break;
|
case INNER_LIKE:
|
queryWrapper.like(finalAttributeName, val);
|
break;
|
case LEFT_LIKE:
|
queryWrapper.likeLeft(finalAttributeName, val);
|
break;
|
case RIGHT_LIKE:
|
queryWrapper.likeRight(finalAttributeName, val);
|
break;
|
case IN:
|
if (!CollectionUtils.isEmpty((Collection<Long>) val)) {
|
queryWrapper.in(finalAttributeName, (Collection<Long>) val);
|
}
|
break;
|
case NOT_EQUAL:
|
queryWrapper.ne(finalAttributeName, val);
|
break;
|
case NOT_NULL:
|
queryWrapper.isNotNull(finalAttributeName);
|
break;
|
case BETWEEN:
|
List<Object> between = new ArrayList<>((List<Object>) val);
|
queryWrapper.between(finalAttributeName, between.get(0), between.get(1));
|
break;
|
case UNIX_TIMESTAMP:
|
List<Object> UNIX_TIMESTAMP = new ArrayList<>((List<Object>) val);
|
if (!UNIX_TIMESTAMP.isEmpty()) {
|
SimpleDateFormat fm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
long time1 = fm.parse(UNIX_TIMESTAMP.get(0).toString()).getTime() / 1000;
|
long time2 = fm.parse(UNIX_TIMESTAMP.get(1).toString()).getTime() / 1000;
|
queryWrapper.between(finalAttributeName, time1, time2);
|
}
|
break;
|
default:
|
break;
|
}
|
}
|
field.setAccessible(accessible);
|
}
|
} catch (Exception e) {
|
System.out.println("自动注入失败:"+e.getMessage());
|
}
|
|
return queryWrapper;
|
}
|
|
|
private static boolean isBlank(final CharSequence cs) {
|
int strLen;
|
if (cs == null || (strLen = cs.length()) == 0) {
|
return true;
|
}
|
for (int i = 0; i < strLen; i++) {
|
if (!Character.isWhitespace(cs.charAt(i))) {
|
return false;
|
}
|
}
|
return true;
|
}
|
|
private static List<Field> getAllFields(Class clazz, List<Field> fields) {
|
if (clazz != null) {
|
fields.addAll(Arrays.asList(clazz.getDeclaredFields()));
|
getAllFields(clazz.getSuperclass(), fields);
|
}
|
return fields;
|
}
|
|
/***
|
* 驼峰命名转为下划线命名
|
*
|
* @param para
|
* 驼峰命名的字符串
|
*/
|
|
public static String humpToUnderline(String para) {
|
StringBuilder sb = new StringBuilder(para);
|
int temp = 0;//定位
|
if (!para.contains("_")) {
|
for (int i = 0; i < para.length(); i++) {
|
if (Character.isUpperCase(para.charAt(i))) {
|
sb.insert(i + temp, "_");
|
temp += 1;
|
}
|
}
|
}
|
return sb.toString();
|
}
|
|
// public static void main(String[] args) {
|
// QueryWrapper<Paging> query = new QueryWrapper<Paging>();
|
// //query.or();
|
// query.or(wrapper -> wrapper.eq("store_id", 1).or().eq("store_id", 2));
|
// //query.like("a",1);
|
// //query.or();
|
// //query.like("b",2);
|
// //query.and(wrapper->wrapper.eq("c",1));
|
// query.eq("1", 1);
|
//
|
// System.out.println(query.getSqlSegment());
|
// }
|
}
|