【问题标题】:Spring Data Rest - How to remove an element from a Page?Spring Data Rest - 如何从页面中删除元素?
【发布时间】:2018-12-26 08:50:46
【问题描述】:

我的项目中有以下 REST 控制器方法

@RequestMapping(method = GET, value = "applications", produces = {MediaType.APPLICATION_JSON_VALUE})
public @ResponseBody
ResponseEntity<?> getApplications(@QuerydslPredicate(root = Application.class) Predicate predicate,
        PersistentEntityResourceAssembler resourceAssembler, Pageable page) {

    Page<ApplicationProjection> applications = appRepo.findAll(predicate, page).
            map(item -> projectionFactory.createProjection(ApplicationProjection.class, item));

    return new ResponseEntity<>(pagedResourcesAssembler.toResource(applications), HttpStatus.OK);

}

现在我想根据条件删除页面的一些元素。如何在 Spring Data Rest 中实现?

【问题讨论】:

  • 您的页面可能有一定的大小。如果您从中删除一些元素,您最终可能会得到一个不完整的页面,客户端。你不能用你的查询来排除你想排除的元素吗?
  • 你的意思是QueryDSL吗?
  • 在这里,您正在调用 findAll 方法,该方法不使用任何标准并选择您的所有实体。为什么不能在存储库中定义另一个方法(使用@Query)并使用所需的条件来排除某些实体?
  • 我正在使用 QueryDSL 谓词,因此我可以根据 queryParams 动态过滤结果。现在 queryParams 是由用户在调用 enpoint 时发送的,但我想为谓词添加一个额外的条件,但我不知道如何实现它
  • 这对我来说就像一个x y problem。我建议您学习如何向谓词添加条件,而不是尝试从页面中删除元素。

标签: java spring spring-data-rest querydsl


【解决方案1】:

您不能直接从页面中删除元素。您可以做的是,从页面中获取内容,这将是一个列表,然后根据您的条件从列表中删除元素,然后使用修改后的列表和大小创建一个新页面。

Page<ApplicationProjection> applications = appRepo.findAll(predicate, page).
                    map(item -> projectionFactory.createProjection(ApplicationProjection.class, item));

List<ApplicationProjection> appList = applications.getContent();
// logic to remove the elements as per your condition modifiedAppList
// create a new Page with the modified list and size
Page<ApplicationProjection> newApplicationsPage = new PageImpl<>(modifiedAppList, PageRequest.of(pageNo, pageSize),modifiedAppList.size());

【讨论】:

  • 感谢您的回复。我一定会看看这个
  • @Charlie 也许接受答案? ;)
猜你喜欢
  • 1970-01-01
  • 2016-09-24
  • 2015-12-07
  • 1970-01-01
  • 2016-12-13
  • 2015-07-08
  • 1970-01-01
  • 2019-10-09
  • 1970-01-01
相关资源
最近更新 更多