Spring Data JPA模拟mybatis plus封装

Posted 诺浅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Data JPA模拟mybatis plus封装相关的知识,希望对你有一定的参考价值。

SpecificationUtil 工具类

/**
 * @author :GuangxiZhong
 * @date :Created in 2021/7/12 9:28
 * @description:
 * @modified By:
 * @version: 1.0
 */
public class SpecificationUtil {
    Map<String, String> conditionMap = new HashMap<>();

    public class JpaCondition {
        public static final String eq = "eq";
        public static final String ne = "ne";
        public static final String gt = "gt";
        public static final String ge = "ge";
        public static final String lt = "lt";
        public static final String le = "le";
        public static final String alike = "alike";
        public static final String llike = "llike";
        public static final String rlike = "rlike";
    }

    public <T> Specification<T> build(Object object) {
        Specification<T> specification = (root, criteriaQuery, criteriaBuilder) -> {
            List<Predicate> predicates = new ArrayList<>();
            Class<?> clz = object.getClass();
            Field[] fields = clz.getDeclaredFields();
            for (Field field : fields) {
                try {
                    String fieldName = field.getName();
                    Method m = object.getClass().getMethod("get" + getMethodName(fieldName));
                    Object val = m.invoke(object);
                    if (val != null) {
                        if (conditionMap == null || conditionMap.size() == 0) {
                            Predicate predicate = criteriaBuilder.equal(root.get(fieldName), val);
                            predicates.add(predicate);
                        } else {
                            String conditionStr = conditionMap.get(fieldName);
                            if (StringUtils.isEmpty(conditionStr)) {
                                Predicate predicate = criteriaBuilder.equal(root.get(fieldName), val);
                                predicates.add(predicate);
                            } else {
                                String type = field.getGenericType().toString();
                                Predicate predicate;
                                switch (conditionStr) {
                                    case JpaCondition.eq:
                                        predicates.add(criteriaBuilder.equal(root.get(fieldName), val));
                                        break;
                                    case JpaCondition.ne:
                                        predicates.add(criteriaBuilder.notEqual(root.get(fieldName), val));
                                        break;
                                    case JpaCondition.gt:
                                        // TODO 未调试
                                        if (type.equals("class java.util.Date")) {
                                            Date v = (Date) val;
                                            predicate = criteriaBuilder.gt(root.get(fieldName).as(Long.class), v.getTime());
                                        } else {
                                            predicate = criteriaBuilder.gt(root.get(fieldName).as(BigDecimal.class), new BigDecimal(val.toString()));
                                        }
                                        predicates.add(predicate);
                                        break;
                                    case JpaCondition.ge:
                                        predicate = criteriaBuilder.greaterThanOrEqualTo(root.get(fieldName).as(String.class), type.equals("class java.util.Date") ? DateUtils.DATETIME.format(val) : val.toString());
//                                    if (type.equals("class java.util.Date")) {
//                                        predicate = criteriaBuilder.greaterThanOrEqualTo(root.get(fieldName).as(String.class), DateUtils.DATETIME.format(val));
//                                    }else{
//                                        predicate = criteriaBuilder.greaterThanOrEqualTo(root.get(fieldName).as(String.class), val.toString());
//                                    }
                                        predicates.add(predicate);
                                        break;
                                    case JpaCondition.lt:
                                        // TODO 未调试
                                        String type1 = field.getGenericType().toString();
                                        Predicate predicate1;
                                        if (type1.equals("class java.util.Date")) {
                                            Date v = (Date) val;
                                            predicate1 = criteriaBuilder.lt(root.get(fieldName).as(Long.class), v.getTime());
                                        } else {
                                            predicate1 = criteriaBuilder.lt(root.get(fieldName).as(BigDecimal.class), new BigDecimal(val.toString()));
                                        }
                                        predicates.add(predicate1);
                                        break;
                                    case JpaCondition.le:
                                        predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get(fieldName).as(String.class), type.equals("class java.util.Date") ? DateUtils.DATETIME.format(val) : val.toString()));
                                        break;
                                    case JpaCondition.alike:
                                        predicates.add(criteriaBuilder.like(root.get(fieldName), SqlUtils.containsLikeValue(val.toString())));
                                        break;
                                    case JpaCondition.llike:
                                        predicates.add(criteriaBuilder.like(root.get(fieldName), SqlUtils.leftLikeValue(val.toString())));
                                        break;
                                    case JpaCondition.rlike:
                                        predicates.add(criteriaBuilder.like(root.get(fieldName), SqlUtils.rightLikeValue(val.toString())));
                                        break;
                                    default:
                                        predicates.add(criteriaBuilder.equal(root.get(fieldName), val));
                                        break;
                                }
                            }
                        }
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
            Predicate[] f = new Predicate[]{};
            f = predicates.toArray(f);
            criteriaQuery.where(f);
            return null;
        };
        return specification;
    }

    private static String getMethodName(String fildeName) {
        byte[] items = fildeName.getBytes();
        items[0] = (byte) ((char) items[0] - 'a' + 'A');
        return new String(items);
    }

    public SpecificationUtil alike(String field) {
        conditionMap.put(field, JpaCondition.alike);
        return this;
    }

    public SpecificationUtil llike(String field) {
        conditionMap.put(field, JpaCondition.llike);
        return this;
    }

    public SpecificationUtil rlike(String field) {
        conditionMap.put(field, JpaCondition.rlike);
        return this;
    }

    public SpecificationUtil eq(String field) {
        conditionMap.put(field, JpaCondition.eq);
        return this;
    }

    public SpecificationUtil ne(String field) {
        conditionMap.put(field, JpaCondition.ne);
        return this;
    }

    /**
     * 大于
     *
     * @param field
     * @return
     */
    public SpecificationUtil gt(String field) {
        conditionMap.put(field, JpaCondition.gt);
        return this;
    }

    public SpecificationUtil ge(String field) {
        conditionMap.put(field, JpaCondition.ge);
        return this;
    }

    /**
     * 小于
     *
     * @param field
     * @return
     */
    public SpecificationUtil lt(String field) {
        conditionMap.put(field, JpaCondition.lt);
        return this;
    }

    public SpecificationUtil le(String field) {
        conditionMap.put(field, JpaCondition.le);
        return this;
    }
}

使用

SpecificationUtil su = new SpecificationUtil();
Specification<InspectionTicket> specification = su.alike("departmentName").alike("initPersonName").alike("employeeName").alike("hospitalName").ge("startTime").le("endTime").build(condition);
inspectionTicketRepository.findAll(specification, p)

service类需要实现JpaSpecificationExecutor

public interface InspectionTicketRepository extends  JpaSpecificationExecutor<InspectionTicket> {}

以上是关于Spring Data JPA模拟mybatis plus封装的主要内容,如果未能解决你的问题,请参考以下文章

markdown jdbc,jpa,spring data jpa,hibernate,mybatis区别

MyBatis对比Spring Data Jpa有啥优势

MyBatis对比Spring Data Jpa有啥优势

Spring data Jpa,Mybatis,读写锁,@Lock 使用

Spring Data JPA 和MyBatis比较

Spring Data JPA 与 MyBatis 对比分析