Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring batch 如何从数据库中检索/设置ItemReader的SQL查询?_Spring Batch - Fatal编程技术网

Spring batch 如何从数据库中检索/设置ItemReader的SQL查询?

Spring batch 如何从数据库中检索/设置ItemReader的SQL查询?,spring-batch,Spring Batch,我有一个spring批处理程序,它从DB中读取数据并进行处理,然后插入(使用ItemWriter)到数据库中的其他表中。这里,我使用了一系列针对ItemReader、ItemProcessor和ItemWriter的SQL查询 我的要求是使用参数和值格式将所有这些查询存储在一个表中,并使用单个DB调用检索它,然后将其传递给ItemReader、ItemProcessor或ItemrWriter。因此,如果将来查询中有任何更改,我们将只进行数据库更新,代码将保持不变 我试图在beforeJob部分

我有一个spring批处理程序,它从DB中读取数据并进行处理,然后插入(使用ItemWriter)到数据库中的其他表中。这里,我使用了一系列针对ItemReader、ItemProcessor和ItemWriter的SQL查询

我的要求是使用参数和值格式将所有这些查询存储在一个表中,并使用单个DB调用检索它,然后将其传递给ItemReader、ItemProcessor或ItemrWriter。因此,如果将来查询中有任何更改,我们将只进行数据库更新,代码将保持不变


我试图在beforeJob部分中执行此操作,但我遇到了一个错误:“java.lang.IllegalArgumentException:必须提供SQL查询”。但是我可以通过在ItemReader方法中进行DB调用来成功地实现这一点。我试图避免这种方法,因为我需要对每个ItemReader、ItemProcessor和ItemWriter进行db调用。请告诉我如何实现这一点?

在我看来,这样的配置通常是在属性中而不是在数据库中存储查询。比如:

batch.query.unload=SELECT ...

您可以使用从数据库读取查询并将其添加到某个键下的执行上下文的tasklet创建一个步骤,然后使用执行上下文中的查询配置面向块的步骤的读取器。下面是一个简单的例子:

1.检索查询并将其置于执行上下文中: 2.使用执行上下文中的查询配置读取器
@Bean
@步进镜
public ItemReader ItemReader(@Value(“#{jobExecutionContext['query']}”)字符串查询){
//返回已配置查询的读卡器
返回null;
}
希望这有帮助

@Bean
public Tasklet queryRetrievalTasklet() {
    return (contribution, chunkContext) -> {
        String query = ""; // retrieve query from db (using a JdbcTemplate for example)
        chunkContext.getStepContext().getJobExecutionContext().put("query", query);
        return RepeatStatus.FINISHED;
    };
}
@Bean
@StepScope
public ItemReader<Integer> itemReader(@Value("#{jobExecutionContext['query']}") String query) {
    // return your reader configured with the query
    return null;
}