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

  • 相关阅读:
    sqlplus时报Linux-x86_64 Error: 13: Permission denied
    thrift之TTransport层的缓存传输类TBufferedTransport和缓冲基类TBufferBase
    Java实现 蓝桥杯 算法提高 新建Microsoft world文档
    Java实现 蓝桥杯 算法提高 新建Microsoft world文档
    Java实现 蓝桥杯 算法提高 快乐司机
    Java实现 蓝桥杯 算法提高 快乐司机
    Java实现 蓝桥杯 算法提高 队列操作
    Java实现 蓝桥杯 算法提高 队列操作
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 合并石子
  • 原文地址:https://www.cnblogs.com/Andrew520/p/9940314.html
Copyright © 2011-2022 走看看