我有一个批处理作业,它将从web服务调用,输入作业参数作为任何select查询。spring批处理作业然后使用JdbcCursorItemReader运行该查询,然后使用FlatFileItemWriter将数据写入CSV。我的问题是我无法将列名从读取器中可用的元数据转移到编写器(相同的步骤)。
对如何做到这一点有什么建议吗?注意:我试图从writer获得构建和访问的头字符串,但bean初始化过程似乎期望头在那时就绪。因此,头总是空的。
@Bean
@StepScope
public JdbcCursorItemReader<Map<String, ?>> getRowsOfDataForExportFromTable(){
JdbcCursorItemReader<Map<String, ? extends Object>> databaseReader = new JdbcCursorItemReader<>();
databaseReader.setDataSource(jdbcTemplate.getDataSource());
databaseReader.setSql("select * from SOME_TABLE where last_updated_date < DATE_SUB(NOW(), INTERVAL 10 DAY);");
databaseReader.setRowMapper(new RowMapper<Map<String, ? extends Object>>() {
@Override
public Map<String, ? extends Object> mapRow(ResultSet resultSet, int i) throws SQLException {
Map<String,String> resultMap = new LinkedHashMap<>();
int numOfColumns = resultSet.getMetaData().getColumnCount();
for (int j = 1; j < numOfColumns+1; j++){
String columnName = resultSet.getMetaData().getColumnName(j);
String value = resultSet.getString(j);
resultMap.put(columnName,value);
}
return resultMap;
}
});
return databaseReader;
}
@Bean
@StepScope
public FlatFileItemWriter<Map<String,Object>> saveDBRecordsToFileSystem(){
FlatFileItemWriter<Map<String,Object>> writer = new FlatFileItemWriter<>();
writer.setResource(new FileSystemResource("/tmp/output.csv"));
DelimitedLineAggregator<Map<String,Object>> delLineAgg = new DelimitedLineAggregator<>();
delLineAgg.setDelimiter("\t");
writer.setHeaderCallback(new FlatFileHeaderCallback() {
public void writeHeader(Writer writer) throws IOException {
// need to get columnsFromDatabaseTable from ItemReader???
for (String header : columnsFromDatabaseTable) {
writer.write(header);
}
}
});
writer.setLineAggregator(delLineAgg);
return writer;
}
@Component
@StepScope
public class ColumnNames {
private Set<String> columnNames;
private boolean isSetOnce;
public void setColumnNames(Set<String> columnNames) {
this.columnNames = columnNames;
isSetOnce = true;
}
public Set<String> getColumnNames() {
return columnNames;
}
public boolean isSetOnce() {
return isSetOnce;
}
}
@Bean
@StepScope
public JdbcCursorItemReader<Map<String, ?>> getRowsOfDataForExportFromTable(ColumnNames columnNames) {
JdbcCursorItemReader<Map<String, ? extends Object>> databaseReader = new JdbcCursorItemReader<>();
databaseReader.setDataSource(jdbcTemplate.getDataSource());
databaseReader.setSql("select * from SOME_TABLE where last_updated_date < DATE_SUB(NOW(), INTERVAL 10 DAY);");
databaseReader.setRowMapper(new RowMapper<Map<String, ? extends Object>>() {
@Override
public Map<String, ? extends Object> mapRow(ResultSet resultSet, int i) throws SQLException {
Map<String, String> resultMap = new LinkedHashMap<>();
int numOfColumns = resultSet.getMetaData().getColumnCount();
for (int j = 1; j < numOfColumns + 1; j++) {
String columnName = resultSet.getMetaData().getColumnName(j);
String value = resultSet.getString(j);
resultMap.put(columnName, value);
}
if (columnNames.isSetOnce()) {
columnNames.setColumnNames(resultMap.keySet());
}
return resultMap;
}
});
return databaseReader;
}
@Bean
@StepScope
public FlatFileItemWriter<Map<String, Object>> saveDBRecordsToFileSystem(ColumnNames columnNames) {
FlatFileItemWriter<Map<String, Object>> writer = new FlatFileItemWriter<>();
writer.setResource(new FileSystemResource("tmp/output.csv"));
DelimitedLineAggregator<Map<String, Object>> delLineAgg = new DelimitedLineAggregator<>();
delLineAgg.setDelimiter("\t");
writer.setHeaderCallback(new FlatFileHeaderCallback() {
public void writeHeader(Writer writer) throws IOException {
for (String header : columnNames.getColumnNames()) {
writer.write(header);
}
}
});
writer.setLineAggregator(delLineAgg);
return writer;
}
问题内容: 我是Elasticearch的新手,并且已经尝试了2天,将一些数据插入Elasticearch。我在Google上发现有很多页面可以帮助创建索引(我不清楚“ index”,换句话说是“插入”吗?)然后很多地方给出了curl命令,但我确实没有知道在哪里执行这些代码行以插入数据。例: 我正在使用Window 7,并且已安装Java并成功运行elasticsearch。任何人都可以向我展示有
问题内容: 我想在我的MySQL数据库中插入整数188和90,但以下代码不起作用: 为什么不起作用? 问题答案: 编辑 为我工作: 在MySQL表;
问题内容: 在SQL Server 2014中,我试图创建一个动态的WHERE子句。 我已将查询构建为字符串,但是当我尝试使用sp_executesql执行查询时,出现以下错误:提示 13您必须声明标量变量“ @desde”。 我不知道如何使sp_executesql识别输入参数。 问题答案: 代替 使用 您必须定义在动态查询中使用的参数,例如 请参考sp_executesql 否则,您可以将动态
null 非常感谢任何指向文档或非常基本的示例的指针。
我创建了一个新的电子应用程序。 在索引中。jsi使用节点文件系统加载数据 如果我试着使用require。JSIT之所以能够工作,是因为它运行在不同的线程上,而不是使用节点进行初始化,更像是一个实际的浏览器窗口。但有没有办法从索引中传递数据呢。js到main。js 我不知道我对这个问题的看法是否部分正确 如果您需要更多代码或信息,请询问!
很新的反应。。。 我试图循环我的this.props.children,以便向他们传递一个在我的父项中定义的字符串。。。在没有在render方法中定义这些子对象的情况下,这是可能的吗? OwnRenderer应该将道具字符串传递给它的所有子级。。。OwnRenderer不知道要渲染哪个孩子,因此无法通过“”直接传递道具。。。 我试着绕过孩子们直接传递那根绳子,但不幸的是,这不起作用。 不知怎的,它