gpt4 book ai didi

java - SeedStack 存储库中的分页

转载 作者:行者123 更新时间:2023-12-02 09:30:56 25 4
gpt4 key购买 nike

在我的 Java 项目中,使用 SeedStack,我使用如下规范进行查询以从聚合中检索数据:

更新:已修复代码示例以显示正确的返回类型方法

public interface ProductRepository extends Repository<Product, ProductId> {
default Stream<Product> discontinuedProducts() {
return get(getSpecificationBuilder().of(Product.class)
.property("discontinued").equalTo(true)
.build()
);
}
}

为了避免潜在的内存不足错误,我想使用分页来拆分在某些存储库查询中检索到的数据。

此外,我想使用与字符串数据存储库中现有的分页功能非常相似的功能。我想保留结果的一些元素(而不是全部)并按“页面”处理它们,而不将所有数据结果保留在集合中。

Spring 中的分页和排序: https://docs.spring.io/spring-data/rest/docs/2.0.0.M1/reference/html/paging-chapter.html

但是,我读了SeedStack文档,并没有发现这个功能。

SeedStack 中的存储库: http://seedstack.org/docs/business/repositories/

所以,我想知道使用 SeedStack 对查询结果进行分页的最佳方法是什么。

最佳答案

SeedStack 提供了以多种不同方式进行分页的帮助程序,但遗憾的是缺乏这方面的文档。

在我们详细介绍之前,请注意您discontinuedProducts()方法应该返回 Stream<Product>而不是List<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 页面。

Note that if you are going to reuse the same specification over and over, it may be useful to turn it into a class (like DiscontinuedProductSpec) or create a method in your repository to build it (like buildDiscontinuedProductSpec()).

还有其他几种方法可以组合这些工具,请查看 Paginator 的 Javadoc , FluentAssemblerRepository 。您还可以查看pagination integration test了解更多示例。

关于java - SeedStack 存储库中的分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57993405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com