SeedStack 提供了帮助程序以几种不同的方式进行分页,但遗憾的是在这方面缺乏文档。
在我们详细介绍之前,请注意您discontinuedProducts()
的方法应该返回 aStream<Product>
而不是 aList<Product>
因为get
存储库的方法返回一个流。
使用 SeedStack 进行分页的主要方法是使用Paginator DSL,它插入存储库的顶部以提供分页。
示例 1(直接对流进行分页):
public class SomeResource {
@Inject
private Paginator paginator;
@Inject
private ProductRepository productRepository;
@Inject
private FluentAssembler fluentAssembler;
public void someMethod() {
Page<Product> page = paginator.paginate(productRepository.discontinuedProducts())
.byPage(1)
.ofSize(10)
.all();
}
}
示例 2(使用规范对存储库进行分页):
public class SomeResource {
@Inject
private Paginator paginator;
@Inject
private ProductRepository productRepository;
@Inject
private SpecificationBuilder specificationBuilder;
public void someMethod() {
Page<Product> page = paginator.paginate(productRepository)
.byPage(1)
.ofSize(10)
.matching(specificationBuilder.of(Product.class)
.property("discontinued").equalTo(true)
.build());
}
}
示例 3(在混合中添加 DTO 映射):
public class SomeResource {
@Inject
private Paginator paginator;
@Inject
private ProductRepository productRepository;
@Inject
private SpecificationBuilder specificationBuilder;
@Inject
private FluentAssembler fluentAssembler;
public void someMethod() {
Page<ProductDto> page = fluentAssembler.assemble(
paginator.paginate(productRepository)
.byPage(1)
.ofSize(10)
.matching(specificationBuilder.of(Product.class)
.property("discontinued").equalTo(true)
.build()))
.toPageOf(ProductDto.class)
}
}
在最后一个示例中,SeedStack 将:
- 将分页谓词添加到您的自定义规范中,
- 将生成的规范转换为正确的持久性查询,
- 获取数据并将其放入页面中,
- 使用正确的汇编程序将域聚合页面转换为 DTO 页面。
请注意,如果您要一遍又一遍地重用相同的规范,将其转换为类(如DiscontinuedProductSpec
)或在存储库中创建一个方法来构建它(如buildDiscontinuedProductSpec()
)可能会很有用。
还有其他几种组合这些工具的方法,请查看Paginator、FluentAssembler和Repository的 Javadoc 。您还可以查看分页集成测试以获取更多示例。