在Spring中将List转换为Page

use*_*109 37 java spring pagination list spring-data

我试图在春天将列表转换为页面.我用它转换了它

new PageImpl(users,pageable,users.size());

但现在我有排序和分页本身的问题.当我尝试传递大小和页面时,分页不起作用.

这是我正在使用的代码.

我的控制器

    public ResponseEntity<User> getUsersByProgramId(
        @RequestParam(name = "programId", required = true) Integer programId Pageable pageable) {

    List<User> users = userService.findAllByProgramId(programId);
    Page<User> pages = new PageImpl<User>(users, pageable, users.size());

    return new ResponseEntity<>(pages, HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)

这是我的用户回购

public interface UserRepo extends JpaRepository<User, Integer>{

public List<User> findAllByProgramId(Integer programId);
Run Code Online (Sandbox Code Playgroud)

这是我的服务

    public List<User> findAllByProgramId(Integer programId);
Run Code Online (Sandbox Code Playgroud)

shi*_*slm 60

我遇到了同样的问题.我使用subList解决了这个问题,即:

int start = pageable.getOffset();
int end = (start + pageable.getPageSize()) > users.size() ? users.size() : (start + pageable.getPageSize());
Page<User> pages = new PageImpl<User>(users.subList(start, end), pageable, users.size());
Run Code Online (Sandbox Code Playgroud)

  • `org.springframework.data.domain.Pageable.getOffset()` 返回一个 long,所以我认为您需要将 `pageable.getOffset()` 转换为 long 或更改 `start` 的类型 (8认同)
  • @OliverGierke我同意你可以直接从存储库中检索`Page`,但情况并非总是如此,例如,如果你的实体有一个OneToMany关联来获取`List`,你想要将它暴露为` Page`. (4认同)
  • 还没有尝试过,但是即使有效,效率也不高。它从数据库中检索所有用户,并返回一个子列表。理想的做法是仅从数据库中检索将通过请求提供服务的分页用户。 (2认同)

小智 19

有一个Page实现

Page<Something> page = new PageImpl<>(yourList);
Run Code Online (Sandbox Code Playgroud)

  • 小心点,这个解决方案根本不使用 Pageable 对象 (2认同)

dub*_*nzi 13

参考文档中所示,Spring Data存储库通过简单地声明类型参数Pageable来确保它们只读取所请求的数据,从而支持对查询方法的分页Page.

Page<User> page = findAllByProgramId(Integer programId, Pageable pageable);
Run Code Online (Sandbox Code Playgroud)

这将返回一个Page对象,其中包含对象中定义的页面大小/设置Pageable.无需获取列表,然后尝试创建一个页面.

  • 解决了OP的问题,但没有解决问题。假设我们有一个需要转换的数据库对象(例如“User”,但我们想要将包含该数据的某些子集的“UserDetails” DTO 的页面发送到前端)。在这种情况下,可能需要手动创建页面。 (10认同)

Ash*_*rma 7

这可能是解决方案。排序和分页也可以这样工作:

控制器:

public ResponseEntity<User> getUsersByProgramId(
   @RequestParam(name = "programId", required = true) Integer programId Pageable pageable) {
       Page<User> usersPage = userService.findAllByProgramId(programId, pageable);
       Page<User> pages = new PageImpl<User>(usersPage.getContent(), pageable, usersPage.getTotalElements());

       return new ResponseEntity<>(pages, HttpStatus.OK);
}
Run Code Online (Sandbox Code Playgroud)

服务:

Page<User> findAllByProgramId(Integer programId, Pageable pageable);
Run Code Online (Sandbox Code Playgroud)

存储库:

public interface UserRepo extends JpaRepository<User, Integer>{
       public Page<User> findAllByProgramId(Integer programId, Pageable pageable);
}
Run Code Online (Sandbox Code Playgroud)

这样,我们也可以返回实体的不同页面。


ema*_*ema 6

在 JHipster 框架中,有一个用于此类操作的接口PageUtil

static <T> Page<T> createPageFromList(List<T> list, Pageable pageable) {
    if (list == null) {
        throw new IllegalArgumentException("To create a Page, the list mustn't be null!");
    }

    int startOfPage = pageable.getPageNumber() * pageable.getPageSize();
    if (startOfPage > list.size()) {
        return new PageImpl<>(new ArrayList<>(), pageable, 0);
    }

    int endOfPage = Math.min(startOfPage + pageable.getPageSize(), list.size());
    return new PageImpl<>(list.subList(startOfPage, endOfPage), pageable, list.size());
}
Run Code Online (Sandbox Code Playgroud)


小智 5

Try This:

public Page<Patient> searchPatientPage(SearchPatientDto patient, int page, int size){
        List<Patient> patientsList = new ArrayList<Patient>();
        Set<Patient> list=searchPatient(patient);
        patientsList.addAll(list);
        int start =  new PageRequest(page, size).getOffset();
        int end = (start + new PageRequest(page, size).getPageSize()) > patientsList.size() ? patientsList.size() : (start + new PageRequest(page, size).getPageSize());

        return new PageImpl<Patient>(patientsList.subList(start, end), new PageRequest(page, size), patientsList.size());
    }
Run Code Online (Sandbox Code Playgroud)


Wil*_*zel 5

您应该像dubonzi的答案所建议的那样去做。

如果您仍想对给定的List使用PagedListHolder使用分页:

List<String> list = // ...

// Creation
PagedListHolder page = new PagedListHolder(list);
page.setPageSize(10); // number of items per page
page.setPage(0);      // set to first page

// Retrieval
page.getPageCount(); // number of pages 
page.getPageList();  // a List which represents the current page
Run Code Online (Sandbox Code Playgroud)

如果需要排序,请使用另一个具有MutableSortDefinition的PagedListHolder构造函数

  • 您能解释一下在这种情况下如何将“PagedListHolder”与“MutableSortDefinition”一起使用吗? (2认同)