【问题标题】:Why doesn't Spring Data allow page size zero?为什么 Spring Data 不允许页面大小为零?
【发布时间】:2016-07-18 17:49:21
【问题描述】:

我有以下情况。有一个典型的无限滚动列表视图和一个带有控制器的 Spring MVC 后端。返回列表项的方法有一个 Pageable 类型的参数来传递当前页面和页面大小。该参数被委托给相应的 PagingAndSortingRepository 定义的存储库方法,以便从数据库中检索结果。这将导致两个数据库查询:一个计数查询和一个从给定页面获取结果的查询。

这很好用,但是,我有另一个视图,它定义了一个按钮来导航到所描述的列表视图。此按钮显示一个带有该列表中所有元素的标记,作为一种预览。为了计算总元素,我使用与列表本身相同的控制器和存储库方法,尽管我只需要计数。

我第一次尝试实现这一点是将页面大小和页面都设置为零,以便在不获取任何元素的情况下计算结果,然后访问返回页面的 totalElements 属性。但是,Spring 不允许页面大小 == 0,并且在这种情况下将设置默认值(例如 10)。

将 size == 0 的情况实现为单个计数查询以支持给定的场景是否有意义?我在我的应用程序的几个部分都有这个用例,如果没有这个功能,我将不得不编写额外的,在我看来,不必要的计数方法。或者还有其他方法可以使用 Spring Data 完成我所描述的吗?

【问题讨论】:

  • 这意味着会有一些基于属性的某些设置的隐含行为,而这些设置并不是为此而设计的。通常,您希望这些事情是明确的,而不是根据实际用于其他用途的属性的值进行切换。我可能会重用相同的方法,将最大页面大小设置为 1(而不是零)。这样你仍然有计数和单个元素。否则创建一个 count 方法来做这些事情并使其明确。
  • 感谢您的回复。我明白你的意思。页面大小 1 是我目前使用它的方式。但是,这仍然需要不必要的查询。我个人的意见是将页面大小设置为 0 实际上不是用于其他用途或滥用。如果我期望结果为 0,我将页面大小设置为 0。主要的一点是,您经常会遇到这样的情况,您首先预览总计数,然后再单击一次,您将获得相应的内容。当编写一个单独的计数查询时,我还必须处理一个额外的控制器方法,这适用于许多视图。

标签: spring spring-mvc spring-data


【解决方案1】:

您可以只使用count,无需经过Pageable

Long count();

【讨论】:

  • 感谢您的回复。我正在使用带有复杂 where 子句 的复杂查询,并且我想重用此方法进行计数。否则我不得不重写这个方法并提供一个额外的计数查询。使用返回的 Page 对象中的计数会更方便。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-04
  • 1970-01-01
  • 2021-03-13
  • 2016-01-06
  • 1970-01-01
相关资源
最近更新 更多