springboot jpa动态生成sql

springboot jpa动态拼装生成sql
第一步、在ServiceImpl中autowired注入 EntityManager对象,定义三个内部成员,CriteriaBuilder 、CriteriaQuery、Root,注入的泛型是要查询的Entity。

@Autowired
    private EntityManager entityManager;
    // 安全查询工厂
    private CriteriaBuilder cb = null;
    // 安全查询主句
    private CriteriaQuery<AssetsInfo> criteriaQuery = null;
    private Root<AssetsInfo> register = null;

第二步、给ServiceImpl一个构造方法,传入一个EntityManager,在通过entityEmanager的方法获取其他三个对象。

public XXXServiceImpl(EntityManager entityManager) { this.entityManager = entityManager; this.cb = this.entityManager.getCriteriaBuilder(); //获取CriteriaBuilder对象 this.criteriaQuery = this.cb.createQuery(AssetsInfo.class); //获取CriteriaQuery对象 this.register = this.criteriaQuery.from(AssetsInfo.class); // 获取root对象 }
第三步、获取一个字段集合。
用一个私有方法生成一个字段集合,传入的参数是一个具体的entity实例化对象。

private Predicate[] getPredicates(EntityClass entity) {  //参数是一个实际的entity
        List<Predicate> predicate = new ArrayList<Predicate>();
        if (entity.getCompanyId()!=null) {  //判断entity中的参数是否为空
            predicate.add(this.cb.equal(this.register.<String>get("参数名"), entity.对应的get方法()));
        }
        if (entity.getDepartmentId()!=null) {  // 判断entity中的参数是否为空
            predicate.add(this.cb.equal(this.register.<String>get("参数名"), entity.对应的get方法()));
        }
        if(StringUtils.isNotBlank(entity.getResponsibilityId())){   \\判断entity中String类型的参数是否为空
            predicate.add(this.cb.equal(this.register.<String>get("String类型参数名"), entity.对应的get方法()));
        }
        return predicate.toArray(new Predicate[0]);
    }

第四步、调用,查询。
先创建一个具体的entity对象,给所需要查询的字段对应的属性赋值;

然后调用criteriaQuery的where方法,传入的参数是

	this.criteriaQuery.where(this.getPredicates(entity));   // entity是创建的具体entity实例化对象
    TypedQuery<EntityClass> typedQuery = this.entityManager.createQuery(this.criteriaQuery);  // EntityClass是entity实际的类名
    List<EntityClass> XXXX_List= typedQuery.getResultList();  //调用查询,返回一个对应的list集合
上一篇:开放搜索服务OpenSearch


下一篇:libevent入门