通过实体反射实现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;
            }
        });
    }
时间: 2024-08-27 20:54:51

通过实体反射实现CriteriaQuery并列条件查询的相关文章

hibernate 多对多注解配置及实体属性条件查询

以下是通过hibernate注解的方式写的多对多关系用户和角色实体,即一个用户有多个角色,一个角色下也有多个用户. 普通属性作为条件查询相信那么简单大家都会了,如下是一个关系实体作为查询条件的小例子. 用户和角色的多对多配置如下: @Entity public class UserInfo { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; private String no; private Str

jpa多条件查询重写Specification的toPredicate方法(转)

Spring Data JPA支持JPA2.0的Criteria查询,相应的接口是JpaSpecificationExecutor.Criteria 查询:是一种类型安全和更面向对象的查询 . 这个接口基本是围绕着Specification接口来定义的, Specification接口中只定义了如下一个方法: Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb); 要理解这个方

【Spring Data 系列学习】Spring Data JPA 自定义查询,分页,排序,条件查询

Spring Boot Jpa 默认提供 CURD 的方法等方法,在日常中往往时无法满足我们业务的要求,本章节通过自定义简单查询案例进行讲解. 快速上手 项目中的pom.xml.application.properties与 Chapter1 相同 实体类映射数据库表 user 实体类 @Entity public class User implements Serializable { private static final long serialVersionUID = -39076354

Django-rest-framework多条件查询/分页/多表Json

Django-rest-framework多条件查询/分页/多表Json django-rest-framework多条件查询需要覆写ListAPIView.get_queryset方法,代码示例: def get_queryset(self):     """     使用request.query_params实现多条件查询,也可以使用django filter ,较简单的     方法是在filter_fields中指定要过滤的字段,但只能表示等值,不灵活,灵活的方式是

hibernate的Criteria条件查询

项目中用到了criteria的查询方式,觉得挺好用的,下班后找了一下资料,一边测试,一边在博客上面记录下来 1.初解 快速浏览了资料,大致了解了以下的内容: 1. Hibernate 定义了CriteriaSpecification接口规范用来完成面向对象的条件查询,Criteria 和 DetachedCriteria 就是CriteriaSpecification的子接口. 2. Criteria 和 DetachedCriteria 的主要区别在于创建的形式不一样,Criteria 是在线

20140911 关于多条件查询

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;using System.Data.SqlClient; namespace 多条件查询{

jdbc案例_分页_条件查询

客户信息增删改查系统 软件工程开发流程:1.瀑布模型 2.螺旋模型 RUP (Rational Unified Process,统一软件开发过程 ) 采用瀑布模型: 需求 --- 需求分析 --- 系统设计(概要.详细设计)---- 编码 --- 测试 --- 实施 --- 维护 * 瀑布模型 缺陷在编码结束之前,客户看不到最终软件产品 ,如果需求.设计出现明显错漏,导致软件后期无法维护,存在重大缺陷 * 瀑布模型对于 新型软件,需求不定软件 风险较大 敏捷开发理念:迭代开发模式 ,将系统功能分

03_MyBatis基本查询,mapper文件的定义,测试代码的编写,resultMap配置返回值,sql片段配置,select标签标签中的内容介绍,配置使用二级缓存,使用别名的数据类型,条件查询ma

 1 PersonTestMapper.xml中的内容如下: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- namespace:命名空间

hibernate条件查询 Criteria查询

criteria查询 的方法详解 1.获取 criteria对象 Criteria criteria = this.getSession().createCriteria(Record.class); 红色部分为实体类,此处的Record代表信息记录类 2.追加条件 criteria = criteria.add(Expression.eq("level", 1)); 红色部分 Expression.eq("",""),两个参数第一个是 实体类中