JPA 使用 Criteria 简单查询工具类方式,具体步骤如下:
什么是Criteria查询
通常的JPQL查询必须要写类似于SELECT * FROM book WHERE id = 1 这样的SQL语句,书写SQL语句的时侯需要时刻注意SQL语句的拼写,如此繁琐而且费时费力,如果采用Criteria查询,则可以省去SQL语句的书写,Criteria查询是一种类型化查询API反射,它生成类型安全查询语句,极大的增加了代码的强壮性和安全性。
当然在JPA中提供了查询接口Query,直接在Query上拼接查询语句也是可以的,但是这样的查询不具备类型安全性。
Criteria查询的优点
Criteria查询可以有效的降低数据访问代码的难度,能够让我们充分利用OO语言的特性来构建查询语句。
Criteria查询的使用
CriteriaBuilder是Criteria 构造器,它是一个很重要的类,用于创建Criteria 查询所需的各种对象。
CriteriaQuery对象用来创建查询,并且可以将查询的主体部分与SELECT或实体类型联系起来。
Predicate接口主要是用来完成复杂的条件组合,比如多个条件的“与”、“或”、“非”关系组合。
Criteria查询的模糊查询
下面是一个模糊查询的例子:
public static Specification<User> optionNameLike(String name){
return new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
return criteriaBuilder.like(root.get("name"), "%" + name + "%" );
}
};
}
该方法实现了实现了一个Specification接口,使用了匿名内部类去实现该接口,实现了JPA的Specification条件查询接口中的toPredicate方法,该方法是抽象方法,需要我们自己去实现。
在toPredicate方法中,主要使用了CriteriaBuilder和Root这两个对象,从而实现了通过字段名查询数据,包含指定关键字的查询方法。
Criteria查询的多条件复合查询
多条件复合查询可以通过多个Predicate对象进行组装,从而实现复杂的复合查询。
下面是一个多条件复合查询的例子:
public static Specification<User> findUsersWithCriteria(String name, String gender){
return new Specification<User>() {
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Predicate namePredicate = null;
Predicate genderPredicate = null;
if (!StringUtils.isEmpty(name)){
namePredicate = cb.like(root.get("name"), "%" + name + "%");
}
if (!StringUtils.isEmpty(gender)){
genderPredicate = cb.equal(root.get("gender"), gender);
}
if (namePredicate != null && genderPredicate != null){
return cb.and(namePredicate, genderPredicate);
}
if (namePredicate != null){
return namePredicate;
}
if (genderPredicate != null){
return genderPredicate;
}
return cb.conjunction();
}
};
}
在该方法的实现中,使用了CriteriaBuilder和Root来实现多条件复合查询。
其中使用了Predicate接口来实现复合查询条件的拼装,通过cb.and()方法实现了AND方式的条件查询,cb.or()方法实现了OR方式的条件查询,从而实现了多条件组合查询。
通过以上两个例子,我们可以看出,JPA 的 Criteria 查询是一种非常方便的查询方式,既灵活又强大,在实现具体业务需求时可以大大简化我们的代码,并且避免了手写 SQL 语句时因语法错误导致的问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JPA 使用criteria简单查询工具类方式 - Python技术站