当JdbcPagingItemReader查询具有联接和别名时,Spring批处理步骤失败。当我删除连接并从employee表中进行简单查询时,它可以正常工作。下面是失败的代码片段。有人遇到过这样的问题吗?任何帮助都将不胜感激。
spring-batch-core-4.0.1。发布spring-boot-2.0.0。释放
@Autowired
@Bean(destroyMethod = "")
@StepScope
public JdbcPagingItemReader<String> dbItemReader(final DataSource dataSource, final PreparedStatementSetter paramSetter) {
return new JdbcPagingItemReaderBuilder<String>().name("dbReader").dataSource(dataSource) .queryProvider(queryProvider(prodDataSource)).rowMapper((rs, rowNum) -> {
return rs.getString("first_name");
}).pageSize(1000).fetchSize(1000).build();
}
@Bean
public PagingQueryProvider queryProvider(final DataSource dataSource) {
final OraclePagingQueryProvider provider = new OraclePagingQueryProvider();
provider.setSelectClause("select first_name");
provider.setFromClause("from employee e join department d on e.dept_no= d.dept_no");
provider.setWhereClause("where d.dept_name in ('HR','Marketing')");
final Map<String, Order> sortKeys = new HashMap<String, Order>();
sortKeys.put("e.dept_no", Order.ASCENDING);
sortKeys.put("e.employee_id", Order.ASCENDING);
provider.setSortKeys(sortKeys);
try {
return provider;
} catch (final Exception e) {
e.printStackTrace();
return null;
}
}
原因:java。sql。SQLException:oracle中的列名无效。jdbc。驾驶员OracleStatement。oracle上的getColumnIndex(OracleStatement.java:3965)~[ojdbc6-11.2.0.3.jar:12.1.0.1.0]。jdbc。驾驶员不敏感可滚动结果集。oracle上的findColumn(InsensitiveScrollableResultSet.java:299)~[ojdbc6-11.2.0.3.jar:12.1.0.1.0]。jdbc。驾驶员GeneratedResultSet。getObject(GeneratedResultSet.java:1394)~[ojdbc6-11.2.0.3.jar:12.1.0.1.0]位于org。阿帕奇。平民dbcp。DelegatingResultSet。getObject(delegatingsultset.java:328)~[commons-dbcp-1.4.jar:1.4]位于org。阿帕奇。平民dbcp。DelegatingResultSet。getObject(delegatingsultset.java:328)~[commons-dbcp-1.4.jar:1.4]位于org。springframework。一批项目数据库JdbcPagingItemReader$PagingRowMapper。mapRow(JdbcPagingItemReader.java:333)~[spring-batch-infrastructure-4.0.0.RELEASE.jar:4.0.0.RELEASE]。springframework。jdbc。果心RowMapperResultSetExtractor。extractData(RowMapperResultSetExtractor.java:93)~[spring-jdbc-5.0.4.RELEASE.jar:5.0.4.RELEASE]位于org。springframework。jdbc。果心RowMapperResultSetExtractor。extractData(RowMapperResultSetExtractor.java:60)~[spring-jdbc-5.0.4.RELEASE.jar:5.0.4.RELEASE]位于org。springframework。jdbc。果心jdbc模板1美元。doInPreparedStatement(JdbcTemplate.java:667)~[spring-jdbc-5.0.4.RELEASE.jar:5.0.4.RELEASE]位于org。springframework。jdbc。果心jdbc模板。执行(JdbcTemplate.java:605)~[spring-jdbc-5.0.4.RELEASE.jar:5.0.4.RELEASE]。。。省略72个公共框架
几年后,我偶然发现了同样的问题。我想给出正确的答案,因为这里并没有完全给出正确的答案。
@Bean
public PagingQueryProvider queryProvider(final DataSource dataSource) {
final OraclePagingQueryProvider provider = new OraclePagingQueryProvider();
provider.setSelectClause("select e.first_name, e.dept_no as dept_no, e.employee_id as employee_id");
provider.setFromClause("from employee e join department d on e.dept_no= d.dept_no");
provider.setWhereClause("where d.dept_name in ('HR','Marketing')");
final Map<String, Order> sortKeys = new HashMap<String, Order>();
sortKeys.put("dept_no", Order.ASCENDING);
sortKeys.put("employee_id", Order.ASCENDING);
provider.setSortKeys(sortKeys);
try {
return provider;
} catch (final Exception e) {
e.printStackTrace();
return null;
}
}
那么,发生了什么变化:
e.dept_no as dept_no,e.employee_id as employee_id
被添加到选择查询中李>
不要在你的SortKeys顺序中使用this(e.)-point,它会很好
我敢打赌,使用连接是行不通的,因为它是页面项阅读器。它需要一个一致的列表和主键。您可以尝试创建一个具有唯一主键的视图,并对其运行简单的查询。