springboot jpa 多条件的复杂查询

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:),      这里是你的条件对象)

发布了546 篇原创文章 · 获赞 138 · 访问量 97万+

猜你喜欢

转载自blog.csdn.net/xingxiupaioxue/article/details/104629992