如何在 Spring MVC (JPA) 中将实体对象列表转换为页面对象?

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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 我的不适用于此...***.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());

【讨论】:

以上是关于如何在 Spring MVC (JPA) 中将实体对象列表转换为页面对象?的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Boot jpa 中将多个外键映射到同一个主键

在 Spring Boot MVC 应用程序中在 JPA 和 Mongo 之间切换

如何在 JPA Hibernate 映射中将 GUID(不是 PK)添加到已经具有 PK(整数)的现有实体

Spring MVC和Spring Data JPA之获取数据表数据放在List集合,显示在JSP页面

如何在spring boot中开发JPA双向实体

如何在 Spring Data 中漂亮地更新 JPA 实体?