• 通过实体反射实现CriteriaQuery并列条件查询


    将实体反射之后获取查询字段的值,并添加到Predicate对象数组中

    public Predicate getPredicateAnd(T entity, Root<T> root, CriteriaBuilder cb) throws IntrospectionException
    
            , InvocationTargetException, IllegalAccessException {
        try {
            //通过反射获取类型
    Class<?> c = entity.getClass();
            //获取类的字段
    Field[] fields = c.getDeclaredFields();
            List<Predicate> predicateList = new ArrayList();
            for (Field field : fields) {
                PropertyDescriptor pd = new PropertyDescriptor(field.getName(), c);
                //获得get方法
    Method getMethod = pd.getReadMethod();
                //执行get方法返回一个Object
    Object fieldVal = getMethod.invoke(entity);
    
                if (fieldVal != null && !fieldVal.equals(0)) {
                    Path<String> path = root.get(field.getName());
                    Predicate p = cb.equal(path, fieldVal);
                    predicateList.add(p);
                }
            }
            return cb.and(predicateList.toArray(new Predicate[]{}));
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return null;
    }

    下面是使用方法,因返回类型为Predicate所以直接作为参数传入到CriteriaQuery<?>的where函数中

    public T findOne(final T entity) {
            return getSpecDao().findOne(new Specification<T>() {
                @Override
                public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) {      
                    try {
                        query.where( getPredicateAnd(entity, root, cb));
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (IntrospectionException e) {
                        e.printStackTrace();
                    }
                    return null;
                }
            });
        }
  • 相关阅读:
    C++ set简介及简单应用
    windows下安装scrapy报错:building 'twisted.test.raiser' extension error: Microsoft Visual C++ 14.0 is required.
    jsp调用Python脚本存取文件
    mysql触发器问题
    javascript调用alert()
    jsp调用Python
    注意细节,注意细节,注意细节
    pandas读取csv文件报错
    [kuangbin带你飞]专题四 最短路练习
    计算机网络之网络应用(应用层)上
  • 原文地址:https://www.cnblogs.com/zhuwenjun/p/4204154.html
Copyright © 2020-2023  润新知