如何过滤弹簧&x27;s页<;实体>;使用java8';s filter()和返回页<;实体>;
我使用自定义查询dsl调用数据库,并使用如何过滤弹簧&x27;s页<;实体>;使用java8';s filter()和返回页<;实体>;,java,spring,hibernate,java-8,Java,Spring,Hibernate,Java 8,我使用自定义查询dsl调用数据库,并使用findAll()调用hibernate获得一个Page。我有一个名为filterValidProducts的过滤器,它调用一个外部服务,并根据外部服务的响应过滤Page中的元素。我找不到合适的收集器来保存过滤后的页面 我注意到的是,如果我传递一些页面大小,它会将响应限制为该页面大小,并且当我将大小传递给我的过滤器时,我实际上无法获得totalElements的预期值 我尝试了以下代码:- public ResponseWrapper<Product
findAll()
调用hibernate获得一个Page
。我有一个名为filterValidProducts
的过滤器,它调用一个外部服务,并根据外部服务的响应过滤Page
中的元素。我找不到合适的收集器来保存过滤后的页面
我注意到的是,如果我传递一些页面大小,它会将响应限制为该页面大小,并且当我将大小
传递给我的过滤器时,我实际上无法获得totalElements
的预期值
我尝试了以下代码:-
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;
}
我想在页面
上进行筛选,而不将其转换为列表
entityPage
中的totalElements
为168。Pageable
的默认大小为25
实际值:
过滤productEntityList
后,它有14个totalElements
如果我用大小查询Pageble
为3,在过滤productEntityList
后,它有3个元素
期望值:
如果我用大小查询Pageble
为3,则totalElements
仍应为14,且每个页面的大小为3
我觉得如果我能够应用entityPage
上的功能filterValidProducts
,并基于过滤器正确地收集页面
更新的totalElements
,那么这个问题就会解决
感谢您阅读本文。
totalElements
是您可以获得的元素数,但在第一次查询中获得的实际元素数默认为25。如果您需要获取更多,我认为您应该查询所有元素或执行一些SQL操作。@TranNgocKhoa我不需要获取更多,我只需要能够应用ProductFilter
code?刚才did@TranNgocKhoatotalElements
是您可以获得的元素数,但在第一次查询中获得的实际元素数默认为25。如果您需要获取更多,我认为您应该查询所有元素或执行一些SQL操作。@TranNgocKhoa我不需要获取更多,我只需要能够应用ProductFilter
code吗?刚才@trannogockhoa做了
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ProductFilter {
private Long clientId;
private Integer page;
private Integer size;
private Long productId;
private ProductType productType;
}