1. 程式人生 > >spring jpa 帶引數分頁查詢(一)

spring jpa 帶引數分頁查詢(一)

 

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集合。