zoukankan      html  css  js  c++  java
  • 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集合。

  • 相关阅读:
    第二章函数对象
    2013/10/24初学BOOST
    [转]delete 多表删除的使用
    vs2010配置boost编程环境(照抄并简化)
    游戏服务器修改状态标志位方法
    小思 引用和指针
    第二章:UNIX标准化及实现
    const指针
    第一章:UNIX基础知识
    基础算法——位运算
  • 原文地址:https://www.cnblogs.com/Andrew520/p/9940314.html
Copyright © 2011-2022 走看看