Spring中列表到页面的转换

问题描述 投票:0回答:17

我正在尝试在春季将列表转换为页面。我已经使用

对其进行了转换

new PageImpl(用户, 可分页, 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);
}

这是我的用户仓库

public interface UserRepo extends JpaRepository<User, Integer>{

public List<User> findAllByProgramId(Integer programId);

这是我的服务

    public List<User> findAllByProgramId(Integer programId);
java spring list pagination spring-data
17个回答
160
投票

我也有同样的问题。我使用了子列表:

final int start = (int)pageable.getOffset();
final int end = Math.min((start + pageable.getPageSize()), users.size());
final Page<User> page = new PageImpl<>(users.subList(start, end), pageable, users.size());

36
投票

有一个

Page
实现

Page<Something> page = new PageImpl<>(yourList);

23
投票

参考文档中所示,Spring Data 存储库通过简单地声明

Pageable
类型的参数来支持查询方法的分页,以确保它们仅读取请求的
Page
所需的数据。

Page<User> page = findAllByProgramId(Integer programId, Pageable pageable);

这将返回一个

Page
对象,其页面大小/设置在
Pageable
对象中定义。无需获取列表,然后尝试从中创建页面。


19
投票

您应该按照 dubonzi 的answer的建议进行操作。

如果您仍然想对给定的

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

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


7
投票
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());
    }

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);
}

服务:

Page<User> findAllByProgramId(Integer programId, Pageable pageable);

存储库:

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

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


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());
}

3
投票

基于@shilaimuslm 评论实现。在这种情况下,如果 start > end 在 subList 中,则不会抛出异常。

List<User> users = // ...

Pageable paging = PageRequest.of(pagePagination, sizePagination);
int start = Math.min((int)paging.getOffset(), users.size());
int end = Math.min((start + paging.getPageSize()), users.size());

Page<User> page = new PageImpl<>(users.subList(start, end), paging, users.size());

3
投票

您可以使用此通用函数将列表转换为页面。

public static<T> Page<T> convertToPage(List<T> objectList, Pageable pageable){
    int start = (int) pageable.getOffset();
    int end = Math.min(start+pageable.getPageSize(),objectList.size());
    List<T> subList = start>=end?new ArrayList<>():objectList.subList(start,end);
    return new PageImpl<>(subList,pageable,objectList.size());
}

1
投票
//1) For a boot application create a paging repository interface
public interface PersonRepository extends PagingAndSortingRepository<Person, 
String> {
// Common CURD method are automatically implemented
}
//2) create a service Interface
public interface PersonService {
    Page<Person> listAllByPage(Pageable pageable); // Use common CURD findAll() method
    Page<Object> listSpecByPage(Pageable pageable, String x);

}
//3) create a service Impl Class of service interface
@Service
public class PersonServiceImpl implements PersonService {

    final PersonRepository personRepository;

    @Autowired
    PersonServiceImpl(PersonRepository personRepository){
    this.personRepository = personRepository;
    }

    @Override
    public Page<Person> listAllByPage(Pageable pageable) {
          return personRepository.findAll(pageable);
    }
    @Override
    public Page<Object> listSpecByPage(Pageable pageable, String path) {
        List<Object> objectlist = new ArrayList<Object>();
        // Do your process to get output in a list by using node.js run on a *js file defined in 'path' varriable
        Page<Object> pages1 = new PageImpl<Object>(objectlist, pageable, objectlist.size());
        return pages1;
    }

}
//4) write your controller
public class PersonController {

    final PersonService personService;

    @Autowired
    PersonController( PersonService personService ){
        this.personService = personService;
    }

    @GetMapping("/get") // Use of findALL() function
    Page<Person> listed( Pageable pageable){
        Page<Person> persons = personService.listAllByPage(pageable);
        return persons;
    } 
    @GetMapping("/spec") // Use of defined function
    Page<Object> listSpec( Pageable pageable, String path){
        Page<Object> obj = personService.listSpecByPage(pageable, path);
        return obj;
   } 

}

1
投票

你没有做出分页结果

new PageImpl<User>(users, pageable, users.size());
不会隐式生成分页结果,

在这种情况下,

pageable
参数只是创建Page对象的元数据,如页面,偏移量,大小...等

所以你必须使用像这样的存储库方法

Page<User>findAllByProgramId(Integer programId, Pageable pageable);


0
投票

谢谢大家,下面的代码适用于我的情况

    int start = pageble.getOffset();
    int end = (start + pageble.getPageSize()) > vehicleModelsList.size() ? vehicleModelsList.size() : (start + pageble.getPageSize());

0
投票

您是否尝试过将存储库扩展到

PagingAndSortingRepository

public interface UserRepo extends PagingAndSortingRepository<Ticket, Integer> {
    Page<User> findAllByProgramId(Integer programId, Pageable pageable);
}

服务

Page<User> findAllByProgramId(Integer programId, Pageable pageable);

我假设您正在使用服务接口:


0
投票

不要返回完整的数组列表,而是根据您的要求使用子列表。 您将从请求正文中的“可分页”对象中获取“偏移量”和大小。


new PageImpl<User>(users.subList(start, end), pageable, users.size());


0
投票

这是分页列表的正确答案

public ResponseEntity<User> getUsersByProgramId(
            @RequestParam(name = "programId", required = true) Integer programId, Pageable pageable) {
        List<User> users = userService.findAllByProgramId(programId);

        final int toIndex = Math.min((pageable.getPageNumber() + 1) * pageable.getPageSize(),
                    bidList.size());
        final int fromIndex = Math.max(toIndex - pageable.getPageSize(), 0);
        Page<User> pages = new PageImpl<User>(users.subList(fromIndex, toIndex), pageable, users.size());
    
        return new ResponseEntity<>(pages, HttpStatus.OK);
}

0
投票

我也面临着同样的问题。我通过先获取总值,然后设置PageImpl

解决了这个问题
Long total =  users.size();
Page<User> pages = new PageImpl<User>(users, pageable, total );

0
投票

从 SpringBoot 2.4 开始,您可以使用

PageableExecutionUtils
,如下所示:

        Query query = new Query();
        query.addCriteria(Criteria.where("ownedParkByOwner").ne(true));

        List<PlaceV2> placeV2s = mongoTemplate.find(query, PlaceV2.class);

        Page<PlaceV2> placeV2Page = PageableExecutionUtils.getPage(
            placeV2s,
            pageable,
            placeV2s::size);

© www.soinside.com 2019 - 2024. All rights reserved.