使用PageFactory.createOffsetBasedPage时如何提供总行数?
在Relay分页规范中添加总行数的实现方法
根据Relay分页规范,分页相关的元数据(比如总行数)确实需要定义在connection对象本身中,而非edges或pageInfo字段里。结合你参考的graphql-spqr示例,可按以下步骤实现:
- 自定义你的Connection类型,新增
totalCount字段用于存储总行数 - 在数据查询逻辑中,同时执行分页数据查询和总记录数查询
- 将总记录数注入Connection对象并返回
代码示例
- 定义包含
totalCount的Connection类:
public class ProjectConnection { private List<ProjectEdge> edges; private PageInfo pageInfo; private Long totalCount; // 新增总行数字段 // 全参构造方法 public ProjectConnection(List<ProjectEdge> edges, PageInfo pageInfo, Long totalCount) { this.edges = edges; this.pageInfo = pageInfo; this.totalCount = totalCount; } // 对应的getter方法 public List<ProjectEdge> getEdges() { return edges; } public PageInfo getPageInfo() { return pageInfo; } public Long getTotalCount() { return totalCount; } }
- 修改查询方法,同时获取分页数据和总记录数:
public ProjectConnection findProjects(int first, String after) { // 1. 查询当前页的项目数据 List<Project> paginatedProjects = projectRepository.findPaginated(first, after); // 2. 查询符合条件的项目总数 Long totalCount = projectRepository.count(); // 3. 组装edges列表 List<ProjectEdge> edges = paginatedProjects.stream() .map(project -> new ProjectEdge(project, generateCursor(project))) .collect(Collectors.toList()); // 4. 构建pageInfo PageInfo pageInfo = buildPageInfo(paginatedProjects, first, after); // 5. 返回包含总行数的Connection对象 return new ProjectConnection(edges, pageInfo, totalCount); }
GraphQL查询示例
之后你就可以在GraphQL查询中直接获取总行数:
query GetProjects { projects(first: 10) { edges { node { id name } } pageInfo { endCursor hasNextPage } totalCount # 获取总行数 } }
内容的提问来源于stack exchange,提问作者Amit Jolly
相关产品推荐
相关产品推荐

