我需要对存储在关系数据库中的数据进行反分类。
彼此之间有太多的表链接,不可能构建一个查询来获取每个数据。
这里有一个简化的情况:
+-------------+ +-------------+
| | 1 N | |
| Unitat +-----------> Authors |
| | | |
+-------------+ +-------------+到目前为止,我已经构建了一个步骤,获取所有Unitat行:
@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是:
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对象中:
@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;
}
}在这里,我的当前步骤和职务配置:
@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
何时以及如何执行下一段代码?
// Here would I need to populate `authors`:
denormalized.addAutors(...);
denormalized.addAutors(...);我希望我解释得很好..。
发布于 2020-11-18 09:38:15
您可以使用驱动查询模式。这样做的目的是在项目处理器中发出请求,以丰富项目。
在您的示例中,查询将获取当前unitat项的作者,并在返回它之前在denormalized项上设置它们。
https://stackoverflow.com/questions/64888740
复制相似问题