首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring批处理:与多个实体一起工作并合并它们

Spring批处理:与多个实体一起工作并合并它们
EN

Stack Overflow用户
提问于 2020-11-18 07:26:03
回答 1查看 261关注 0票数 0

我需要对存储在关系数据库中的数据进行反分类。

彼此之间有太多的表链接,不可能构建一个查询来获取每个数据。

这里有一个简化的情况:

代码语言:javascript
复制
+-------------+           +-------------+
|             | 1       N |             |
|   Unitat    +----------->   Authors   |
|             |           |             |
+-------------+           +-------------+

到目前为止,我已经构建了一个步骤,获取所有Unitat行:

代码语言:javascript
复制
@Bean
public ItemReader<Unitat> reader() {
    String sql = "select * from unitat";

    JdbcCursorItemReader<Unitat> jdbcCursorItemReader = new JdbcCursorItemReader<>();
    jdbcCursorItemReader.setDataSource(this.dataSource);
    jdbcCursorItemReader.setSql(sql);
    jdbcCursorItemReader.setVerifyCursorPosition(false);
    jdbcCursorItemReader.setRowMapper(new UnitatRowMapper());

    return jdbcCursorItemReader;
}

RowMapper是:

代码语言:javascript
复制
public class UnitatRowMapper implements RowMapper<Unitat> {

    private static final String ID_COLUMN = "id";
    //...

    @Override
    public Unitat mapRow(ResultSet resultSet, int numRow) throws SQLException {
        Unitat unitat = new Unitat();

        unitat.setId(resultSet.getString(ID_COLUMN));
        //...

        return unitat;
    }

}

这是我的处理器。它只用于将字段填充到UnitatDenormalized对象中:

代码语言:javascript
复制
@Component
public class UnitatMappingItemProcessor implements ItemProcessor<Unitat, UnitatDenormalized> {

    @Override
    public UnitatDenormalized process(Unitat unitat) throws Exception {
        UnitatDenormalized denormalized = new UnitatDenormalized();

        denormalized.setId(unitat.getId());
        //denormalized.set...()

        return denormalized;
    }

}

在这里,我的当前步骤和职务配置:

代码语言:javascript
复制
@Bean
public Step step(
    ItemReader<Unitat> mssqlItemReader,
    UnitatMappingItemProcessor processor,
    SolrItemWriter solrItemWriter
) {
    return this.stepBuilderFactory
        .get("unitat")
        .<Unitat, UnitatDenormalized>chunk(100)
        .reader(mssqlItemReader)
        .processor(processor)
        .writer(solrItemWriter)
        .build();
}

@Bean
public Job job(Step step) {
    Job job = this.jobBuilderFactory.get("job1")
        .flow(step)
        .end()
        .build();
    return job;
}

如何获得作者并将其合并到以前获得的unitat

何时以及如何执行下一段代码?

代码语言:javascript
复制
// Here would I need to populate `authors`:
denormalized.addAutors(...);
denormalized.addAutors(...);

我希望我解释得很好..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-18 09:38:15

您可以使用驱动查询模式。这样做的目的是在项目处理器中发出请求,以丰富项目。

在您的示例中,查询将获取当前unitat项的作者,并在返回它之前在denormalized项上设置它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64888740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档