首页 > 解决方案 > 如何将参数添加到 Spring Batch 项目阅读器?

问题描述

我觉得这是一件非常基本的事情,但我找不到有关如何做到这一点的文档。我找到的所有文档/示例都假定静态查询。我可以将其作为静态查询来执行,但我想知道如何使用变量来执行此操作。我正在尝试将 Spring Batch 与 Postgres 一起使用。

我想要做的是这样的查询:

SELECT * from SOME_TABLE WHERE SOURCE = ? AND (EXPIRES BETWEEN ? AND ?)

我尝试了各种编写查询的方法,例如用变量替换问号:source。我什至不确定我是否使用了正确的ItemReader类,或者我是否需要编写自己的类。这是我的配置:

@Bean
protected JdbcPagingItemReader<JpaEntitlement> itemReader(DataSource dataSource)
        throws Exception {
    JdbcPagingItemReader<JpaEntitlement> pagingItemReader = new JdbcPagingItemReader<>();
    pagingItemReader.setDataSource(dataSource);
    pagingItemReader.setPageSize(1);

    PagingQueryProvider pagingQueryProvider = createQueryProvider(dataSource);
    pagingItemReader.setQueryProvider(pagingQueryProvider);
    pagingItemReader.setRowMapper(new BeanPropertyRowMapper<>(JpaClass.class));
    return pagingItemReader;
}

private PagingQueryProvider createQueryProvider(DataSource dataSource) throws Exception {
    SqlPagingQueryProviderFactoryBean pagingQueryProvider =
            new SqlPagingQueryProviderFactoryBean();
    pagingQueryProvider.setSelectClause("*");
    pagingQueryProvider.setFromClause("FROM SOME_TABLE");
    pagingQueryProvider.setWhereClause("WHERE SOURCE = ? AND (EXPIRES between ? AND ?)");
    pagingQueryProvider.setDataSource(dataSource);
    return pagingQueryProvider.getObject();
}

我想最终的问题是:Spring Batch 中是否包含一些东西来做到这一点?如果没有,我应该覆盖什么来添加此功能?

补充一点,这是需要批量处理的东西,因为它可能有数千条记录。

标签: javaspringpostgresqlspring-batch

解决方案


我觉得这是一件非常基本的事情,但我找不到有关如何做到这一点的文档。

参考文档中的相关部分是作业和步骤属性的后期绑定,它提供了如何使用JobScope和的代码示例StepScope。这个想法是,您可以在运行时(而不是在配置时急切地)从作业参数或作业/步骤执行上下文中动态绑定您的阅读器中的查询属性。

希望这可以帮助。


推荐阅读