Java 如何在REST服务中进行分页?

Java 如何在REST服务中进行分页?,java,spring,spring-boot,spring-data-jpa,Java,Spring,Spring Boot,Spring Data Jpa,我必须编写一些REST服务,它应该处理一百万个条目,并以JSON格式向用户返回响应。我正在使用Spring编写一些REST控制器并进行分页 public List<ContactDto> getAllContacts() { double countItems = contactRepo.count(); int pages = (int) Math.ceil(countItems / totalItemsPerPage); Lis

我必须编写一些REST服务,它应该处理一百万个条目,并以JSON格式向用户返回响应。我正在使用Spring编写一些REST控制器并进行分页

public List<ContactDto> getAllContacts() {

        double countItems = contactRepo.count();
        int pages = (int) Math.ceil(countItems / totalItemsPerPage);

        List<Contact> contacts = new ArrayList<>();
        for (int i = 0; i < pages; i++) {
            Page<Contact> page = contactRepo.findAll(PageRequest.of(i, totalItemsPerPage));
            contacts.addAll(page.stream().collect(Collectors.toList()));
        }

        return contacts.stream()
                .map(entity -> new ContactDto(entity.getId(), entity.getName()))
                .collect(Collectors.toList());
    }
公共列表getAllContacts(){ double countItems=contactRepo.count(); int pages=(int)Math.ceil(countItems/totalItemsPerPage); 列表联系人=新建ArrayList(); 对于(int i=0;inewcontactdto(entity.getId(),entity.getName()) .collect(Collectors.toList()); } 我是春天和分页的新手

在这个方法中是有感觉还是我做错了什么

我的意思是我想知道我使用的分页是写的还是错的


谢谢你的帮助

似乎您正在收集所有页面中的所有联系人,这没有意义,因为您正在将所有数据存储在内存中,否定了所有延迟加载的好处

我建议如下:

1.Rest控制器应能够接受pageNumber和pageSize参数:

@GetMapping(value="/uri/{pageNumber}/{pageSize}")
public List<Contact> getContactsPage(@PathVariable("pageNumber") final Integer pageNumber, @PathVariable("pageSize") final Integer pageSize) {
//service or repository call
}

4.如有必要,将页面映射到DTO。

您应该查看。

如果您随时在内存中保留一百万个条目,那么这将无法缩放。在我看来,上面保持读取内存中的所有条目,并将它们拆分为页面(但仍在内存中)。在处理如此大的数据时,最好对数据库执行一个特定的查询,只返回所需的页面(或者可能是几个页面,并将这些页面缓存一段时间,以防客户下一步需要这些页面)。@john16384我有一个任务,我必须从数据库中获取所有数据,并用Java代码进行处理。我不知道获得最佳性能的最佳方法是什么?我应该使用分页还是不使用分页从数据库获取所有数据?从数据库中读取所有数据后,我将其保存在缓存中。如果不需要同时处理所有的实体,可以使用Spring的反应堆栈返回数据流;从数据库中获取页面中的数据,对其进行处理,然后在获取下一个页面之前将其发送给客户端,依此类推
public interface ContactRepository extends PagingAndSortingRepository<Contact, Long> {
    Page<Contact> fingAll(Pageable pageable);
}
final Pageable contactsPageable = PageRequest.of(pageNumber, pageSize);