一、寫個接口繼承JpaRepositoryjava
@NoRepositoryBean public interface BaseRepository<T,PK extends Serializable> extends JpaRepository<T,PK> { }
二、JpaRepository內部已經有好多接口,看到已經繼承了PagingAndSortingRepositoryapp
@NoRepositoryBean public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> { List<T> findAll(); List<T> findAll(Sort var1); List<T> findAll(Iterable<ID> var1); <S extends T> List<S> save(Iterable<S> var1); void flush(); <S extends T> S saveAndFlush(S var1); void deleteInBatch(Iterable<T> var1); void deleteAllInBatch(); T getOne(ID var1); <S extends T> List<S> findAll(Example<S> var1); <S extends T> List<S> findAll(Example<S> var1, Sort var2); }
三、內部有分頁接口findAll(pageable pageable)spa
@NoRepositoryBean public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> { Iterable<T> findAll(Sort sort); Page<T> findAll(Pageable pageable); }
四、精彩部分來了3d
能夠看到,自帶的接口findAll(pageable pageable)只有一個分頁參數,可是沒有帶查詢參數。code
若是咱們須要查詢某個條件下的分頁,那該怎麼辦呢?看下面咱們的jpa dao接口對象
@Transactional public interface UserJPA extends JpaRepository<UserEntity,Long> { //查詢大於20歲的用戶 @Query(value = "select * from t_user where t_age > ?1",nativeQuery = true) public List<UserEntity> nativeQuery(int age); //根據用戶名、密碼刪除一條數據 @Modifying @Query(value = "delete from t_user where t_name = ?1 and t_pwd = ?2",nativeQuery = true) public void deleteQuery(String name,String pwd);
//能夠看到,jpa寫法findByName並無帶分頁(實際上jpa是根據返回的類型自動判斷是否分頁), //若是返回類型爲Page,則返回的數據是帶分頁參數的集合,若是返回類型是list,則返回的數據是list集合。 Page<UserEntity> findByName(String name, Pageable pageable);//直接添加分頁參數
//能夠是多個參數的分頁查詢 pageable Page<UserEntity> findByNameAndAddress(String name,String addr, Pageable pageable); }
看下面的兩種狀況:blog
一、返回類型爲Page排序
返回的數據格式爲:帶分頁的參數的集合繼承
二、返回格式爲list接口
修改jpa接口返回數據的類型爲list
List<UserEntity> findByNameAndAddress(String name,String addr, Pageable pageable);
@RequestMapping("/pagetest") public List<UserEntity> getUserByPage() { UserEntity user = new UserEntity(); user.setSize(2); user.setSord("desc"); user.setPage(1); //獲取排序對象 Sort.Direction sort_direction = Sort.Direction.ASC.toString().equalsIgnoreCase(user.getSord()) ? Sort.Direction.ASC : Sort.Direction.DESC; //設置排序對象參數 Sort sort = new Sort(sort_direction, user.getSidx()); //建立分頁對象,從第一頁開始,此處user.getPage()-1要減一 PageRequest pageRequest = new PageRequest(user.getPage() - 1, user.getSize(), sort); //執行分頁查詢 String name = "admin"; String addr = "jinansf4"; // return userJPA.findByName(name,pageRequest); return userJPA.findByNameAndAddress(name,addr,pageRequest); }
能夠看到返回到數據就是list集合
結論:jpa是根據返回的類型自動判斷是否分頁,若是返回類型爲Page,則返回的數據是帶分頁參數的集合,若是返回類型是list,則返回的數據是list集合。