当前位置: 首页 > 知识库问答 >
问题:

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

哈翔
2023-03-14

当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个公共框架

共有3个答案

赫连明诚
2023-03-14

我敢打赌,使用连接是行不通的,因为它是页面项阅读器。它需要一个一致的列表和主键。您可以尝试创建一个具有唯一主键的视图,并对其运行简单的查询。

阎修明
2023-03-14

不要在你的SortKeys顺序中使用this(e.)-point,它会很好

邹海荣
2023-03-14

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

@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被添加到选择查询中
 类似资料:
  • 问题内容: 我创建了一个存储过程,我想在其中添加替代的order by子句。问题是查询在“无效的列名’aantal regels’”上失败 这是我现在的查询。 希望有人可以帮助我! 问题答案: 您不能以这种方式按别名排序。 第一种选择是重复代码。注意:仅仅因为重复代码,SQL引擎就不会天真地再次执行它,而是重用了结果。 或全部使用子查询…

  • 问题内容: 我正在为我的应用程序使用Hibernate 3.2.5。 我有一张桌子和一张桌子。 部门java 员工.java HBM映射文件 以下是本机SQL的代码: 我得到了例外: 当我直接在数据库中运行查询时,我会得到正确的输出,但是在hibernate状态下,它给出的是。我已经确认列名仅是正确的。 请让我知道如何解决此问题。 问题答案: 您的映射中包含以下内容: 但是您的sql 和之间没有这

  • 当我直接在db中运行查询时,我得到了正确的输出,但在hibernate中,它给出了一个。我已经确认列名只是正确的。 请让我知道如何解决这个问题。

  • 问题内容: 我使用别名来引用计算列。这是我尝试制作的实际代码的一部分,用于计算相似度并返回相似度得分为3或更高的匹配项。 异常消息: 无效的列名“相似性”。 由于相似性不是真正的专栏文章,我将如何进行这项工作? 问题答案: 在查询的投影()阶段执行列别名和计算,该阶段在选择(和)阶段之后发生。因此,无法在子句或条件中引用它们,因为它们尚不存在。您可以将带有子句的查询用作子查询,也可以在子句中重复计

  • 问题内容: 我有一个JSP文件,我将在Eclipse,Maven和Tomcat的帮助下将其部署在Java项目中。我还有一些其他的JSP文件与此文件几乎相同,尽管它们运行不同的操作。无论如何,当我转到页面时,我已经给出了: Bug是一个自定义类,可以接受结果集--并执行以下操作: 其中BUG_ID,PERSON_OPENED_BY,PERSON_ASSIGNED_TO,TITLE和PROJECT_I

  • 问题内容: 我正在尝试执行以下动态查询,但出现错误:无效的列名’cat’ 如果我将其更改为普通查询,则可以: 任何人都可以指出我的错误吗?谢谢。 问题答案: 由于是varchar,因此需要在其周围包含单引号,并且需要在sql字符串内放置该子句的右括号。 新的代码将是: 查看打印了查询字符串的SQL Fiddle演示 。这将生成一个查询字符串,如下所示: