jpa specification条件查询

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

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



    2.  /* 
    3.      * 实现带查询条件的分页效果 id>5 
    4.      * 调用JpaSpecificationExecutor的page findAll(Speciation,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 specification=new Specification() {  
    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 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 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.     }  

你可能感兴趣的:(jpa,&,hibernate,&,mybatis)