在springboot jpa中 我们可以使用Example.of(entity) 来进行条件的查询(这个之前已经介绍过了),但是这个方法不是太灵活,无法使条件灵活的变化。今天在看公司大佬写的代码时发现了一个特别实用的类,Predicate 。下面介绍一下他的用法,因为本人也在学习过程当中,这篇文章会做一定的改善。
1 我们首先定义一个接口继承PagingAndSortingRepository 和JpaSpecificationExecutor ,在实验的过程中如果不继承PagingAndSortingRepository ,spring容器就不会创造这个接口代理类对象,具体是为什么我也没有搞清楚。准备工作做好,上代码
Pageable pageable = PageRequest.of(0, 1);
User user = new User();
user.setId("4");
user.setLoginTime("fs");
user.setStatus("0");
user.setToken("d");
List<User> users = jpaDemo.findAll(new Specification<User>() {
private static final long serialVersionUID = 1L;
@Override
public Predicate toPredicate(Root<User> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
// TODO Auto-generated method stub
Predicate onePredicate = criteriaBuilder.equal(root.get("id"), user.getId());
Predicate towPredicate = criteriaBuilder.equal(root.get("status"), user.getStatus());
Predicate threePredicate = criteriaBuilder.or(onePredicate, towPredicate);//这个是让这两个条件进行or的连接。
Predicate fiPredicate = criteriaBuilder.like(root.get("loginTime"), user.getLoginTime());
return criteriaBuilder.and(threePredicate, forwPredicate,fiPredicate);; //进行and连接
}
});
这个会产生如下的sql
Hibernate:
select user0_.id as id1_3_, user0_.login_time as login_ti2_3_,
user0_.status as status3_3_, user0_.token as token4_3_,
user0_.user_account as user_acc5_3_ from user user0_ where
(user0_.id=? or user0_.status=?) and user0_.token=? and (user0_.login_time like ?)
还有一个重要的关键点
如果你的实体类有主外键的关系的话 ,你可以根据外键的关系,获取导另一个对象的属性,聚个例子:
class Cart { 购物车类 实体类有主外键的关系
private String cartId
private String name;
private Product product;//这个是货品信息
}
class Product{
private String productid
private String name;
}
此时这个方法可以这样写
criteriaBuilder.equal(root.get("product").get("productid:), 这里是你的条件对象)