使用@RestController在Spring中进行分页,但不使用Spring Data Rest Pageable?
Posted
技术标签:
【中文标题】使用@RestController在Spring中进行分页,但不使用Spring Data Rest Pageable?【英文标题】:Pagination in Spring using @RestController, but without using Spring Data Rest Pageable? 【发布时间】:2020-04-21 05:32:06 【问题描述】:我知道使用 Spring Data Rest 我可以像这样使用 Pagination 的内置功能
Page<Product> findByCategoryId(@RequestParam("id") Long id, Pageable pageable);
但是,我在项目中使用 Spring mvc @RestController 并希望实现相同的功能 我试过这样:-
Session currentSession = entityManager.unwrap(Session.class);
Query<Product> theQuery = currentSession.createQuery("from Product", Product.class);
theQuery.setFirstResult((pageNumber-1) * pageSize); // This is 0 based
theQuery.setMaxResults(pageSize);
List<Product> dataList = theQuery.getResultList();
return dataList;
它有效,但我没有得到表中记录总数的count。 对于 UI 分页,我需要它。
所以我必须像上面那样每次都先点击 2 个查询,然后再点击 1 个查询来获取记录大小。 (如果记录更新,可能会导致数据同步问题)
或者
SINGLE QUERY
有没有更好的方法来实现这一点【问题讨论】:
您不能在单个查询中执行此操作,您需要 2. 1 用于计数,另一个用于页面元素。此外,这不是 Spring Data REST,而是 Spring Data 的基本功能,因此您不需要 Spring Data Rest 即可使用可分页(您也可以将其与纯 Spring Data JPA 一起使用)。 好的,谢谢@M。 Deinum 【参考方案1】:如果您需要记录总数,则必须创建第二个查询。
你可以在一个带有子查询的查询中做到这一点,但你不能使用实体作为返回类型。
关于数据同步问题:如果您在同一事务中运行两个查询,则没有问题。
顺便说一句。你为什么要解开 Hiberante Session?在您的示例中不需要这样做。
【讨论】:
“顺便说一句。你为什么要解开 Hiberante Session?在你的例子中没有必要这样做。” - 那我将如何创建一个会话对象来创建查询? entityManager.createQuery。 EntityManager 相当于 JPA 中的 Session。会话是 Hiberante 的遗产 回到我原来的问题,那么 Pageable 在内部是如何工作的。它是使用单个查询还是多个查询来获取总记录大小。 您没有将 Pageable 与 Spring Data JPA 一起使用。如果您使用 JPA 存储库,则可以返回 Page。 Spring Data JPA 创建了两个查询 如果我的回答对您有帮助,我将不胜感激。以上是关于使用@RestController在Spring中进行分页,但不使用Spring Data Rest Pageable?的主要内容,如果未能解决你的问题,请参考以下文章
使用 @RestController 在 Spring Boot 中发布数据时出错
如何在 Spring RestController 中下载 excel 文件
如何在 Spring Boot 的 @RestController 注释用于创建请求处理程序的方法中使用带有参数的构造函数
如何在Jpa中使用所选实体创建行,RestController Spring Boot