Spring Data JPA:过滤页面内容导致页面小于请求的页面

时间:2016-01-06 23:10:05

标签: java spring jpa spring-data-jpa

情况

我们正在构建一个简单的API,以使用如下的分页来获取属于给定 Foo Bar

GET /foo/1/bar?pageSize=50&pageOffset=1

在后端,我们使用Spring Data JPA分页支持,如:

Page<Bar> barsPage = repo.findBarsForFoo(fooId, new PageRequest(pageOffset, pageSize));

问题

我们需要过滤掉barPage中的某些元素 - 简单,如:

List<Bar> filtered = barsFilter.removeSome(barsPage.getContent())

将组件委托过滤到其他服务(让我们称之为拒绝者):

class BarsFilter {
  @Autowired Rejector1 rejector1;
  @Autowired Rejector2 rejector2;

  public List<Bar> filterSome(List<Bar> bars) {
    return bars.stream()
      .filter(bar -> rejector1.matches(bar))
      .filter(bar -> rejector2.matches(bar))
      .collect(toList());
  }
}

问题是,API客户端将获得比项目要求更少的项目

陷阱

过滤逻辑很复杂,它依赖于其他组件。它不能写为单个数据库查询。

这里最合理的事情是什么?返回一个较小的页面?人为地增加页面大小?利用一些Spring Data或JPA机制来支持这种自定义逻辑?

1 个答案:

答案 0 :(得分:1)

在我看来,它的发布取决于你将通过这个API发送的内容。

案例1: 您想获取通知列表 - &gt;在删除其中一些列表之后,只需返回较小的列表,就不会影响用户体验。

案例2: 您希望获得特定国家/地区的20个用户的排名,这就是您删除其中一些用户的原因。那么你真的需要返回20个用户,所以最好实现一些自定义逻辑。人为增加的页面声音根本没有效率。

希望有所帮助。