使用@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

Spring Boot项目@RestController使用重定向redirect

使用 Spring Security 启用对 @RestController 的访问