自定义注解进行条件查询

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;

/**

  • @authorNiu Niu
    */
    @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());
// }
}

下面使用自定的注解名字

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 Niu Niu
    */
    @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
    }

}

使用对应的数据 就可以拿到对应集合数据啦 非常简单
@Override
//@Cacheable
public List queryAll(YxStoreBargainQueryCriteria criteria) {
return baseMapper.selectList(QueryHelpPlus.getPredicate(YxStoreBargain.class, criteria));
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值