/**
- Copyright © 2018-2021
- All rights reserved, Designed By www.yixiang.co
*/
package co.yixiang.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
@author Liu yang
@date 2019-6-4 13:52:30
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Query {// Dong ZhaoYang 2017/8/7 基本对象的属性名
String propName() default “”;
// Dong ZhaoYang 2017/8/7 查询方式
Type type() default Type.EQUAL;/**
- 多字段模糊搜索,仅支持String类型字段,多个用逗号隔开, 如@Query(blurry = “email,username”)
*/
String blurry() default “”;
enum Type {
// jie 2019/6/4 相等
EQUAL
// Dong ZhaoYang 2017/8/7 大于等于
, GREATER_THAN
//大于
, GREATER_THAN_NQ
// Dong ZhaoYang 2017/8/7 小于等于
, LESS_THAN
// Dong ZhaoYang 2017/8/7 中模糊查询
, INNER_LIKE
// Dong ZhaoYang 2017/8/7 左模糊查询
, LEFT_LIKE
// Dong ZhaoYang 2017/8/7 右模糊查询
, RIGHT_LIKE
// Dong ZhaoYang 2017/8/7 小于
, LESS_THAN_NQ
// jie 2019/6/4 包含
, IN
// 不等于
,NOT_EQUAL
// between
,BETWEEN
// 不为空
,NOT_NULL
// 查询时间
,UNIX_TIMESTAMP
}- 多字段模糊搜索,仅支持String类型字段,多个用逗号隔开, 如@Query(blurry = “email,username”)
}
这是自定义的 注解类,通过后面的一个类进行 数据的判定和分页的判定 ,可以对数据进行 自定义数据查询
/**
- Copyright © 2018-2021
- All rights reserved, Designed By www.yixiang.co
*/
package co.yixiang.common.utils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import co.yixiang.annotation.Query;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;
/**
@author Liu Yang
@date 2019-6-4 14:59:48
*/
@Slf4j
@SuppressWarnings({“unchecked”, “all”})
public class QueryHelpPlus {public static <R, Q> QueryWrapper getPredicate(R obj, Q query) {
QueryWrapper queryWrapper = new QueryWrapper();
if (query == null) {
return queryWrapper;
}
try {
List 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 (ObjectUtil.isNull(val) || “”.equals(val)) {
continue;
}
// 模糊多字段
if (ObjectUtil.isNotEmpty(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 GREATER_THAN_NQ:
queryWrapper.gt(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 (CollUtil.isNotEmpty((Collection) val)) {
queryWrapper.in(finalAttributeName, (Collection) val);
}
break;
case NOT_EQUAL:
queryWrapper.ne(finalAttributeName, val);
break;
case NOT_NULL:
queryWrapper.isNotNull(finalAttributeName);
break;
case BETWEEN:
List between = new ArrayList<>((List) val);
queryWrapper.between(finalAttributeName, between.get(0), between.get(1));
break;
case UNIX_TIMESTAMP:
List UNIX_TIMESTAMP = new ArrayList<>((List)val);
if(!UNIX_TIMESTAMP.isEmpty()){
SimpleDateFormat fm = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
Date time1 = fm.parse(UNIX_TIMESTAMP.get(0).toString());
Date time2 = fm.parse(UNIX_TIMESTAMP.get(1).toString());
queryWrapper.between(finalAttributeName, time1, time2);
}
break;
default:
break;
}
}
field.setAccessible(accessible);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
}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 getAllFields(Class clazz, List 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 query = new QueryWrapper();
// //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());
// }
}
你可以通过自定义的修改进行数据的 查询 而不再使用其他数据
这里需要注意 我们的数据必须在前端全部都是string 类型记行数据的查询
这里是一个基本的分页方法:
public PageResult selectAll(CarAndUserVo carAndUserVo, Pageable pageable) {
getPage(pageable);
PageInfo page = new PageInfo<>(baseMapper.selectList(QueryHelpPlus.getPredicate(CarAndUser.class, carAndUserVo)));
return generator.convertPageInfo(page, CarAndUser.class);
}
拿到的数据是 pageresult 我们自己的 分页实体