如何使用java8的filter()过滤Spring的Page <entity>对象并返回Page <entity>

时间:2019-04-22 22:38:18

标签: java spring hibernate java-8

我正在使用自定义查询dsl调用数据库,并通过Page<Product>调用获得findAll()来休眠。我有一个名为filterValidProducts的过滤器,该过滤器调用外部服务,并将根据外部服务的响应来过滤Page<Product>中的元素。我找不到合适的收集器来保存过滤后的Page<Product>

我注意到的是,如果我传递某些页面大小,它将响应限制在该页面大小,而当我将totalElements传递到过滤器时,我实际上无法获得size的期望值。

我尝试了以下代码:-

public ResponseWrapper<Product> listProducts(ProductFilter productFilter){
    Page<Product> entityPage = productDAO.list(productFilter);
    List<ProductEntity> productEntityList = entityPage.getContent().stream()
                        .filter(filterValidProducts)
                        .collect(Collectors.toList());
    Pageable pageable = PageRequest.of(productFilter.getPage(), 
productFilter.size());
    Page<ProductEntity> productEntityFiltered=
            new PageImpl<>(productEntityList , pageable, productEntityList .size());
    ResponseWrapper<Product> responseWrapper =
            productTransformer.transformPage(productEntityFiltered, productFilter);

    return responseWrapper;
}

ProductFilter的样子

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ProductFilter {
    private Long clientId;
    private Integer page;
    private Integer size;
    private Long productId;
    private ProductType productType;
}

我想对Page<Product>进行过滤,而不将其转换为List<ProductEntity>

totalElements中的entityPage为168。Pageable的默认大小为25。

实际:

过滤productEntityList后,它有14个totalElements

如果我查询的Pageble的大小为3,则过滤productEntityList后将包含3个元素。

预期:

如果我将Pageble的大小查询为3,则totalElements仍应为14,且每个页面的大小均为3。

我觉得如果我能够在filterValidProducts上应用函数entityPage并基于过滤器正确地收集到Page<Product>更新的totalElements上,那么这个问题将得到解决。

非常感谢您阅读。

0 个答案:

没有答案