0

在我的 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 对查询结果进行分页的最佳方法是什么。

4

1 回答 1

1

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())可能会很有用。

还有其他几种组合这些工具的方法,请查看PaginatorFluentAssemblerRepository的 Javadoc 。您还可以查看分页集成测试以获取更多示例。

于 2019-09-19T17:22:11.907 回答