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集合