SpringdDataJpa如何创建一个不分页,但是排序的pageable

public Pageable createPagenation() {
        int page = WebClass.requestToInt("pageNo");
        int pageSize = WebClass.requestToInt("pageSize");
        
        Sort s = new Sort(Sort.Direction.DESC, "id");
        if (page > 0 && pageSize > 0) {
            return PageRequest.of(page - 1, pageSize, s);
        } else {
            return Pageable.unpaged();
        }
    }

想封装一个自动构建分页对象的方法,
但是,在不需要分页的时候,
Pageable.unpaged()返回不需要分页的对象,但是这个对象,无法设置排序属性,
只有getSort(),没有setSort()。

请问有大佬知道应该怎么处理吗?

阅读 764
评论 更新于 2019-09-25
    2 个回答
    imango
    • 1.4k

    虽然自己平常用的时候没有用到Pageable.unpaged()返回的这个枚举Unpaged,但是点进去看,无非是用枚举单例模式创建了一个Pageable的实例嘛

    clipboard.png

    所以针对你提到的问题,从中我想回答两个疑问,当然也许不是疑问,算是理解方式

    1. 你提到 只有getSort(),没有setSort()
      关于这一点,你的理解可能有点点偏差,当然编程思想很多,只要能解决问题都是好思想,不一概而论,不过这里分享哈我的理解,主要是Pageable.unpaged()本身就是Pageable接口的实例,没有setSort()方法,其实就是Pageable接口没有setSort()方法,Pageable接口本身代表着分页信息的抽象,这个抽象定义了分页信息应该有的抽象行为,这种抽象接口,在我自己的开发经验中定义为属于实体信息的抽象,不是流程类的抽象接口,实体信息的抽象我一般会更多的注意抽象实体信息本身所具有的性质或者叫属性,那是去定义从一个实体中你能有拿到什么信息,而不是注入或者修改什么信息,所以在我看来一个分页信息对象没有setSort()很正常,就像假如你把人类做一个抽象接口叫PersonPerson里有个属性名字(name),你觉得你的接口Person应不应该有个setName的方法么?
    2. 如何处理这种问题(你想要不分页,但是需要排序)
      处理方式其实也很简单,你都看到了别人官方怎么做了。。。你不就是学着官方改改不就完了么。。。也就是你也学着Pageable.unpaged()写一个新的枚举,其他的都仿照Pageable.unpaged(),只有getSort方法你进行你的定制修改,写一个新的枚举叫UnpagedSortById,举例如下:
    public enum UnpagedSortById implements Pageable {
    
        INSTANCE;
    
        /*
         * (non-Javadoc)
         * @see org.springframework.data.domain.Pageable#isPaged()
         */
        @Override
        public boolean isPaged() {
            return false;
        }
    
        /*
         * (non-Javadoc)
         * @see org.springframework.data.domain.Pageable#previousOrFirst()
         */
        @Override
        public Pageable previousOrFirst() {
            return this;
        }
    
        /*
         * (non-Javadoc)
         * @see org.springframework.data.domain.Pageable#next()
         */
        @Override
        public Pageable next() {
            return this;
        }
    
        /*
         * (non-Javadoc)
         * @see org.springframework.data.domain.Pageable#hasPrevious()
         */
        @Override
        public boolean hasPrevious() {
            return false;
        }
    
        /*
         * (non-Javadoc)
         * @see org.springframework.data.domain.Pageable#getSort()
         */
        @Override
        public Sort getSort() {
            return new Sort(Sort.Direction.DESC, "id");
        }
    
        /*
         * (non-Javadoc)
         * @see org.springframework.data.domain.Pageable#getPageSize()
         */
        @Override
        public int getPageSize() {
            throw new UnsupportedOperationException();
        }
    
        /*
         * (non-Javadoc)
         * @see org.springframework.data.domain.Pageable#getPageNumber()
         */
        @Override
        public int getPageNumber() {
            throw new UnsupportedOperationException();
        }
    
        /*
         * (non-Javadoc)
         * @see org.springframework.data.domain.Pageable#getOffset()
         */
        @Override
        public long getOffset() {
            throw new UnsupportedOperationException();
        }
    
        /*
         * (non-Javadoc)
         * @see org.springframework.data.domain.Pageable#first()
         */
        @Override
        public Pageable first() {
            return this;
        }
    }

    很狠哈,注释都不带改的,直接粘贴大法搞定,其实其中getSort方法改改

    clipboard.png

    当然这样是可以解决问题的,不过从我个人编码习惯来说,我觉得UnpagedSortById这个枚举不ok,因为从枚举来看只能按照id排序,如果以后还要其他字段排序,我还得写个UnpagedSortByXXX这样的枚举,里面的重复代码就多了,索性直接可以干脆大家共享一个枚举,只是区分不同的Sort即可,比如这样:

    @Getter
    @AllArgsConstructor
    public enum UnpagedSort implements Pageable {
    
        BY_ID_DESC(new Sort(Sort.Direction.DESC, "id")),
        BY_NAME_ASC(new Sort(Sort.Direction.ASC, "name")),
    
        ;
    
        private Sort sort;
    
        /*
         * (non-Javadoc)
         * @see org.springframework.data.domain.Pageable#isPaged()
         */
        @Override
        public boolean isPaged() {
            return false;
        }
    
        /*
         * (non-Javadoc)
         * @see org.springframework.data.domain.Pageable#previousOrFirst()
         */
        @Override
        public Pageable previousOrFirst() {
            return this;
        }
    
        /*
         * (non-Javadoc)
         * @see org.springframework.data.domain.Pageable#next()
         */
        @Override
        public Pageable next() {
            return this;
        }
    
        /*
         * (non-Javadoc)
         * @see org.springframework.data.domain.Pageable#hasPrevious()
         */
        @Override
        public boolean hasPrevious() {
            return false;
        }
    
        /*
         * (non-Javadoc)
         * @see org.springframework.data.domain.Pageable#getPageSize()
         */
        @Override
        public int getPageSize() {
            throw new UnsupportedOperationException();
        }
    
        /*
         * (non-Javadoc)
         * @see org.springframework.data.domain.Pageable#getPageNumber()
         */
        @Override
        public int getPageNumber() {
            throw new UnsupportedOperationException();
        }
    
        /*
         * (non-Javadoc)
         * @see org.springframework.data.domain.Pageable#getOffset()
         */
        @Override
        public long getOffset() {
            throw new UnsupportedOperationException();
        }
    
        /*
         * (non-Javadoc)
         * @see org.springframework.data.domain.Pageable#first()
         */
        @Override
        public Pageable first() {
            return this;
        }
    }

    以上是个人看法,仅供参考哈

    评论 赞赏 2019-09-25
      Yujiaao
      • 10.3k

      觉得需求有问题,不想分页,把pageSize搞大不就可以了么?比如说10000, 至少还有个保险,真的数据几十万也至于死掉。

      评论 赞赏 2019-09-25
        撰写回答

        登录后参与交流、获取后续更新提醒