【问题标题】:How to convert a list of enity object to page object in Spring MVC (JPA)?如何在 Spring MVC (JPA) 中将实体对象列表转换为页面对象?
【发布时间】:2016-09-05 07:44:31
【问题描述】:

我有一个List 的实体。 如何使用 Spring MVC 4 和 Spring Data JPA 将其转换为 Page 对象?

【问题讨论】:

    标签: java spring-mvc pagination spring-data


    【解决方案1】:

    为此有一个Page implementation

    final Page<Something> page = new PageImpl<>(theListOfSomething);
    

    【讨论】:

    • 它不分页,而是在一页中返回所有项目
    • 会有错误
    【解决方案2】:

    还有一个Constructor

    Page<Something> page = new PageImpl<>(listOfsomething, pageable, listOfsomething.size());
    

    【讨论】:

    • 这里是创建pageable对象的方法:Pageable pageable = PageRequest.of(pageNumber, size); 注意pageNumber从零开始的并且PageablePageRequest是从org.springframework.data.domain。有关详细信息,请参阅Pageable documentation
    • @Mehraj Malik 我的不适用于此...stackoverflow.com/questions/62485592/…
    【解决方案3】:

    我认为您还需要获取正确的页面内容。

    
    PageRequest pageRequest = PageRequest.of(offset, limit);
    
    List<Product> products = getProducts();
    
    int total = products.size();
    int start = toIntExact(pageRequest.getOffset());
    int end = Math.min((start + pageRequest.getPageSize()), total);
    
    List<Product> output = new ArrayList<>();
    
    if (start <= end) {
        output = products.subList(start, end);
    }
    
    return new PageImpl<>(
        output,
        pageRequest,
        total
    );
    

    【讨论】:

      【解决方案4】:

      您可以将列表传递给函数以使其成为可分页对象。如果子列表的起始值小于列表大小,则返回空内容。

        public Page<?> toPage(List<?> list, Pageable pageable) {
              int start = (int) pageable.getOffset();
              int end = Math.min((start + pageable.getPageSize()), list.size());
              if(start > list.size())
                  return new PageImpl<>(new ArrayList<>(), pageable, list.size());
              return new PageImpl<>(list.subList(start, end), pageable, list.size());
          }
      

      【讨论】:

        【解决方案5】:

        以上答案都假设列表是您希望返回的。以下是对包含 total 条记录的列表执行分页的方法。

        //pageNum starts with 1
        //size: page size
        //totalRecords, total records
        Page<Record> myMethod(int pageNum, int size, List<MyRecord> totalRecords){
            if(pageNum<1){
                pageNum = 1;
            }
            if(size < 1){
                size = 10;
            }
            //spring page starts with 0
            Pageable pageable = new PageRequest(pageNum-1, size);
            //when pageNum * size is too big(bigger than list.size()), totalRecords.subList() will throw a exception, we need to fix this
            if(pageable.getOffset() > list.size()){
                    pageable = new PageRequest(0, size);
            }
            List<MyRecord> pageRecords = totalRecords.subList(pageable.getOffset(), Math.min(pageable.getOffset() + pageable.getPageSize(), totalRecords.size()));
            
            Page springPage = new PageImpl<>(pageRecords, pageable, totalRecords.size());
            return springPage;
        }
        

        【讨论】:

          【解决方案6】:

          通常,控制器应接收Pageable 对象作为参数。 Pageable 对象包含页码、页面大小和排序信息。

          然后就可以通过排序查询JpaRepository中的所有实体,生成Page对象:

          List<Entity> allList = jpaRepository.findAll(pageable.getSort());
          
          List<Entity> pageList = allList.stream()
              .skip(pageable.getPageSize() * pageable.getPageNumber())
              .limit(pageable.getPageSize())
              .collect(Collectors.toList());
          
          return new PageImpl<>(pageList, pageable, allList.size());
          
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-05-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多