1、寫個接口繼承JpaRepository
@NoRepositoryBean
public interface BaseRepository<T,PK extends Serializable> extends JpaRepository<T,PK>
{
}
2、JpaRepository內部已經有好多接口,看到已經繼承了PagingAndSortingRepository
@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);
}
3、內部有分頁接口findAll(pageable pageable)
@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
Iterable<T> findAll(Sort sort);
Page<T> findAll(Pageable pageable);
}
4、精彩部分來了
可以看到,自帶的接口findAll(pageable pageable)只有一個分頁參數,但是沒有帶查詢參數。
如果我們需要查詢某個條件下的分頁,那該怎么辦呢?看下面我們的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); }
看下面的兩種情況:
1、返回類型為Page


返回的數據格式為:帶分頁的參數的集合

2、返回格式為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集合。
