以下都是基於spring-data-jpa2.1.8
1.單純分頁,沒有條件
/*** * 直接用dao調用分頁 */ @Test public void findPageDao1() { try { System.out.println("=============== findPage ================" ); //jpa 1.*寫法 //Pageable pageable = new PageRequest(0,2, Sort.Direction.DESC,"userId");//sprint-data-common 2.0以下用這個 //jpa 0.*寫法 1 //Sort sort=Sort.by(Sort.Direction.DESC,"userId"); //Pageable pageable = PageRequest.of(0, 2,sort); //jpa 0.*寫法 2 Pageable pageable = PageRequest.of(0, 2, Sort.Direction.DESC,"userId");//一定要是model中的字段注意大小寫,sprint-data-common 2.0以上用這個 Page<SysUser> pageList=sysUserDao.findAll(pageable); if(pageList!=null && pageList.getTotalPages()>0){ System.out.println("page list:" ); for(SysUser item:pageList){ System.out.println("userid: "+item.getUserId()+"__userAccount:"+item.getAccount()); } }else { System.out.println("page is null:" ); } } catch (Exception e) { System.out.println("error:" +e.getMessage()); // e.printStackTrace(); } }
2.(不推薦)使用findAll(example,pageable)Example/ExampleMatcher表達式分頁 不支持 a=1 and (b=2 or c=3)這樣的邏輯 https://stackoverflow.com/questions/42584191/spring-query-by-example-using-or
/*** * (不推薦)直接用dao調用分頁帶條件 Example<S> 不支持 a=1 and (b=2 or c=3)這樣的邏輯 https://stackoverflow.com/questions/42584191/spring-query-by-example-using-or */ @Test public void findPageDao2() { try { System.out.println("=============== findPage ================" ); Sort sort = new Sort(Sort.Direction.DESC, "userId"); //分頁 int page=1;//第幾頁 int pageSize=2;//每頁條數 //Pageable pageable = new PageRequest(page - 1, pageSize, sort);//已過時 Pageable pageable = PageRequest.of(page - 1, pageSize, sort); //多條件 account='test' and username='zw' SysUser entity=new SysUser(); entity.setAccount("test"); entity.setUserName("zw"); ExampleMatcher matcher = ExampleMatcher.matching() .withMatcher("account", ExampleMatcher.GenericPropertyMatchers.contains()) .withMatcher("userName", ExampleMatcher.GenericPropertyMatchers.contains());//like Example<SysUser> example = Example.of(entity,matcher); //Example<SysUser> example = Example.of(entity); Page<SysUser> pageList= sysUserDao.findAll(example,pageable); if(pageList!=null && pageList.getTotalPages()>0){ System.out.println("page list:" ); for(SysUser item:pageList){ System.out.println("userid: "+item.getUserId()+"__userAccount:"+item.getAccount()); } }else { System.out.println("page is null:" ); } } catch (Exception e) { System.out.println("error:" +e.getMessage()); // e.printStackTrace(); } }
3.使用Specification,功能比較強大,可以實現常用的條件功能 Specification使用說明請參考:https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/domain/Specification.html
/*** * 直接用dao調用分頁帶條件 Specification<S> */ @Test public void findPageDao3() { try { System.out.println("=============== findPage ================" ); Sort sort = new Sort(Sort.Direction.DESC, "userId"); //分頁 int page=1;//第幾頁 int pageSize=2;//每頁條數 //Pageable pageable = new PageRequest(page - 1, pageSize, sort);//已過時 Pageable pageable = PageRequest.of(page - 1, pageSize, sort); //多條件 SysUser entity=new SysUser(); entity.setAccount("test"); entity.setUserName("zw1"); Specification<SysUser> spec=new Specification<SysUser>(){ @Override public Predicate toPredicate(Root<SysUser> root, CriteriaQuery<?> query, CriteriaBuilder cb) { Predicate p1 = cb.equal(root.get("account"), entity.getAccount()); Predicate p2 = cb.equal(root.get("userName"), entity.getUserName()); return cb.or(p1,p2); } }; Page<SysUser> pageList= sysUserDao.findAll(spec,pageable); if(pageList!=null && pageList.getTotalPages()>0){ System.out.println("page list:" ); for(SysUser item:pageList){ System.out.println("userid: "+item.getUserId()+"__userAccount:"+item.getAccount()); } }else { System.out.println("page is null:" ); } } catch (Exception e) { System.out.println("error:" +e.getMessage()); // e.printStackTrace(); } }
4.自己寫SQL條件返回List<Model>,這個最靈活可以隨意寫自己的SQL
/*** * 直接用dao調用分頁帶條件返回List<Model> 直接用SQL */ @Test public void findPageDao4() { try { System.out.println("=============== findPage ================" ); //分頁 int page=1;//第幾頁 int pageSize=2;//每頁條數 //多條件 SysUser entity=new SysUser(); entity.setAccount("test"); entity.setUserName("zw1"); //查總數sql String sqlCount="select count(*) from SYS_User where 1=1 and (account=:account or userName=:userName) Order by UserID desc "; //查分頁的數據 String sql="select * from SYS_User where 1=1 and (account=:account or userName=:userName) Order by UserID desc "; Query queryCount = sysUserService.getEntityManager().createNativeQuery(sqlCount); queryCount.setParameter("account", entity.getAccount()); queryCount.setParameter("userName", entity.getUserName()); Object count=queryCount.getSingleResult(); Integer listCount = count != null ? Integer.parseInt(count.toString()) : 0;//記錄總數 Query query = sysUserService.getEntityManager().createNativeQuery(sql,SysUser.class);//指定Model query.setParameter("account", entity.getAccount()); query.setParameter("userName", entity.getUserName()); int offSet = PageUtil.getOffset(page, pageSize); query.setFirstResult(offSet).setMaxResults(pageSize); List<SysUser> pageList=query.getResultList(); if(pageList!=null && pageList.size()>0){ System.out.println("page list:" +pageList.size()); System.out.println("page Index:" +page+" item size :" +pageSize+" item Total :" +listCount); for(SysUser item:pageList){ System.out.println("userid: "+item.getUserId()+"__userAccount:"+item.getAccount()); } }else { System.out.println("page is null:" ); } } catch (Exception e) { System.out.println("error:" +e.getMessage()); // e.printStackTrace(); } }
4.自己寫SQL條件返回List<Map>,這個最靈活可以隨意寫自己的SQL
/*** * 直接用dao調用分頁帶條件返回List<Map> 直接用SQL */ @Test public void findPageDao5() { try { System.out.println("=============== findPage ================" ); //分頁 int page=1;//第幾頁 int pageSize=2;//每頁條數 //多條件 SysUser entity=new SysUser(); entity.setAccount("test"); entity.setUserName("zw1"); //查總數sql String sqlCount="select count(*) from SYS_User where 1=1 and (account=:account or userName=:userName) Order by UserID desc "; //查分頁的數據 String sql="select * from SYS_User where 1=1 and (account=:account or userName=:userName) Order by UserID desc "; Query queryCount = sysUserService.getEntityManager().createNativeQuery(sqlCount); queryCount.setParameter("account", entity.getAccount()); queryCount.setParameter("userName", entity.getUserName()); Object count=queryCount.getSingleResult(); Integer listCount = count != null ? Integer.parseInt(count.toString()) : 0;//記錄總數 Query query = sysUserService.getEntityManager().createNativeQuery(sql);//這時只有sql query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);//添加這一行才能返回List<Map> query.setParameter("account", entity.getAccount()); query.setParameter("userName", entity.getUserName()); int offSet = PageUtil.getOffset(page, pageSize); query.setFirstResult(offSet).setMaxResults(pageSize); List<Map> pageList=query.getResultList(); if(pageList!=null && pageList.size()>0){ System.out.println("page list:" +pageList.size()); System.out.println("page Index:" +page+" item size :" +pageSize+" item Total :" +listCount); for(Map item:pageList){ System.out.println("userid: "+item.get("UserID").toString()+"__userAccount:"+item.get("Account").toString()); } }else { System.out.println("page is null:" ); } } catch (Exception e) { System.out.println("error:" +e.getMessage()); // e.printStackTrace(); } }
sysUserService代碼
@PersistenceContext protected EntityManager em;// 類似hibernate session //給子類用的 public EntityManager getEntityManager() { return em; }
SysUserDao代碼
@Repository public interface SysUserDao<SysUser,Integer> extends JpaRepository <T,ID>, JpaSpecificationExecutor<T> { }