java - 无效的列名异常 - 带别名的 JdbcPagingItemReader 查询

标签 java spring-boot jdbc spring-batch

当 JdbcPagingItemReader 查询具有联接和别名时,Spring 批处理步骤失败。当我删除联接并仅从员工表中执行简单查询时,它工作得很好。下面是失败的代码片段。有人遇到过这样的问题吗?任何帮助,将不胜感激。

spring-batch-core-4.0.1.RELEASE spring-boot-2.0.0.RELEASE

@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;
    }
}

Caused by: java.sql.SQLException: Invalid column name at oracle.jdbc.driver.OracleStatement.getColumnIndex(OracleStatement.java:3965) ~[ojdbc6-11.2.0.3.jar:12.1.0.1.0] at oracle.jdbc.driver.InsensitiveScrollableResultSet.findColumn(InsensitiveScrollableResultSet.java:299) ~[ojdbc6-11.2.0.3.jar:12.1.0.1.0] at oracle.jdbc.driver.GeneratedResultSet.getObject(GeneratedResultSet.java:1394) ~[ojdbc6-11.2.0.3.jar:12.1.0.1.0] at org.apache.commons.dbcp.DelegatingResultSet.getObject(DelegatingResultSet.java:328) ~[commons-dbcp-1.4.jar:1.4] at org.apache.commons.dbcp.DelegatingResultSet.getObject(DelegatingResultSet.java:328) ~[commons-dbcp-1.4.jar:1.4] at org.springframework.batch.item.database.JdbcPagingItemReader$PagingRowMapper.mapRow(JdbcPagingItemReader.java:333) ~[spring-batch-infrastructure-4.0.0.RELEASE.jar:4.0.0.RELEASE] at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:93) ~[spring-jdbc-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:60) ~[spring-jdbc-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:667) ~[spring-jdbc-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:605) ~[spring-jdbc-5.0.4.RELEASE.jar:5.0.4.RELEASE] ... 72 common frames omitted

最佳答案

几年后,我偶然发现了同样的问题。 我想给出正确答案,因为这里没有完全设置正确答案。

@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.put 不得使用别名。 问题是 sortKeys 将从结果列表中检索数据。
    如果您设置别名 => 行映射器会尝试获取 alias.column_name,但该别名不存在,因为结果集不包含别名。
    因此,我们还在选择查询中默认添加 AS 以避免列名不明确。

关于java - 无效的列名异常 - 带别名的 JdbcPagingItemReader 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49762248/

相关文章:

java - Spring JavaConfig : error handling with WebApplicationInitializer

java - 编写一个空的 MapReduce 作业

java - 如何动态设置 Spring Data Cassandra 键空间?

java - Thymeleaf 和 Spring Boot 不从本地化文件读取属性 - 显示问号而不是本地化字符串

java - 如何在 Java 中计算以下 JSON 值 U.O.M Wise 的总值

java - PreparedStatement 上的 ArrayOutOfBoundsException

带数据库的 Java Applet

java - 为什么unix和Java运行时显示的统计数据存在差异

mysql - MySQL 的 Connector/J 可以与 MariaDB 一起使用吗?

java - 如何在 Vaadin 14 + Spring Boot 中构建工作 jar 文件?