【问题标题】:Pagination in Spring using @RestController, but without using Spring Data Rest Pageable?使用@RestController在Spring中进行分页,但不使用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

标签: spring spring-boot spring-mvc pagination hibernate-query


【解决方案1】:

如果您需要记录总数,则必须创建第二个查询。

你可以在一个带有子查询的查询中做到这一点,但你不能使用实体作为返回类型。

关于数据同步问题:如果您在同一事务中运行两个查询,则没有问题。

顺便说一句。你为什么要解开 Hiberante Session?在您的示例中不需要这样做。

【讨论】:

  • “顺便说一句。你为什么要解开 Hiberante Session?在你的例子中没有必要这样做。” - 那我将如何创建一个会话对象来创建查询?
  • entityManager.createQuery。 EntityManager 相当于 JPA 中的 Session。会话是 Hiberante 的遗产
  • 回到我原来的问题,那么 Pageable 在内部是如何工作的。它是使用单个查询还是多个查询来获取总记录大小。
  • 您没有将 Pageable 与 Spring Data JPA 一起使用。如果您使用 JPA 存储库,则可以返回 Page。 Spring Data JPA 创建了两个查询
  • 如果我的回答对您有帮助,我将不胜感激。
猜你喜欢
  • 1970-01-01
  • 2019-10-12
  • 2018-05-18
  • 2011-12-23
  • 1970-01-01
  • 2020-02-28
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
相关资源
最近更新 更多