jpa specification条件查询

    1. spring data jpa 通过创建方法名来做查询,只能做简单的查询,那如果我们要做复杂一些的查询呢,多条件分页怎么办,这里,spring data jpa为我们提供了JpaSpecificationExecutor接口,只要简单实现toPredicate方法就可以实现复杂的查询

      1.首先让我们的接口继承于JpaSpecificationExecutor



    2.  /* 
    3.      * 实现带查询条件的分页效果 id>5 
    4.      * 调用JpaSpecificationExecutor的page<T> findAll(Speciation<T>,PageAble pageable) 
    5.      * specification:封装了JPA Criteria 查询的条件 
    6.      * pageable:封装了请求分页的消息,例如pageno,pagesize,sort 
    7.      */  
    8.     @Test  
    9.     public void testJpaSpeciationExecutor(){  
    10.         int pageNo=0;  
    11.         int pageSize=5;  
    12.         PageRequest pageRequest=new PageRequest(pageNo, pageSize);  
    13.         //通常使用Specification 的匿名内部类,  
    14.         Specification<Person> specification=new Specification<Person>() {  
    15.   
    16.         /* 
    17.          * @param root:代表的查询的实体类 
    18.          * @param query:可以从中得到Root对象,即告知JPA Criteria查询要查询哪一个实体类, 
    19.          * 还可以来添加查询条件,还可以结合EntityManager对象得到最终查询的TypedQuery 对象 
    20.          * @Param cb:criteriabuildre对象,用于创建Criteria相关的对象工程,当然可以从中获取到predicate类型 
    21.          * @return:代表一个查询条件 
    22.          */  
    23.             @Override  
    24.             public Predicate toPredicate(Root<Person> root,  
    25.                     CriteriaQuery<?> query, CriteriaBuilder cb) {  
    26. //              Path path=root.get("id");  
    27. //              Predicate predicate=cb.gt(path, 5);  
    28.                   
    29.                 Predicate p1=cb.like(root.get("id").as(String.class), "%"+"1"+"%");  
    30.                 Predicate p2=cb.equal(root.get("lastName").as(String.class), "sd");  
    31.                 Predicate p3=cb.like(root.get("email").as(String.class), "%s%");  
    32. //              构建组合的Predicate示例:  
    33.                 Predicate p = cb.and(p3,cb.or(p1,p2));  
    34.                   
    35.                 return p;  
    36.             }  
    37.               
    38.         };  
    39.           
    40.         Page<Person> page=personRepotory.findAll(specification,pageRequest);  
    41.       
    42.         System.out.println("总记录数"+page.getTotalElements());  
    43.         System.out.println("当前第几页"+page.getNumber());  
    44.         System.out.println("总页数"+page.getTotalPages());  
    45.         System.out.println("当前页面的List"+page.getContent());  
    46.         System.out.println("当前页面的记录数"+page.getNumberOfElements());  
    47.     }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值