java - Spring Batch 2.2.7 应用程序抛出 "Invalid column name"。非常简单的代码炸弹

标签 java sql spring spring-batch

我有一个 Spring Batch 2.2.7 应用程序,一直运行良好,但今天开始抛出“无效列”。

我在 DataGrip 中运行了以下 SQL,只是为了确保它工作正常。

SELECT * FROM (SELECT * FROM Equipment WHERE rowNum < 
 10 ORDER BY id ASC) WHERE ROWNUM <= 10

代码:

factoryBean.setDataSource(dataSource);
factoryBean.setSelectClause("select *");
factoryBean.setFromClause("from EQUIPMENT");
factoryBean.setSortKey("ID");
factoryBean.setWhereClause("where rowNum < 10");

SQL 没有改变,数据库架构没有改变,代码没有改变。 12 小时前还可以,但现在就不行了。什么给出?.

我尝试通过在设置属性后重新启动应用程序来进一步解决这个问题 logging.level.org.springframework.jdbc.core=TRACE

这导致了以下输出日志。

2020-06-05 15:37:37.162 DEBUG 17276 --- [           main] o.s.jdbc.core.JdbcTemplate               : Executing SQL query [SELECT * FROM (SELECT * FROM Equipment WHERE rowNum < 10 ORDER BY id ASC) WHERE ROWNUM <= 10]
2020-06-05 15:37:37.715 ERROR 17276 --- [           main] o.s.batch.core.step.AbstractStep         : Encountered an error executing step xxxxxxxxxx in job yyyyyyyyyyy

org.springframework.jdbc.BadSqlGrammarException: StatementCallback; bad SQL grammar [SELECT * FROM (SELECT * FROM Equipment WHERE rowNum < 10 ORDER BY id ASC) WHERE ROWNUM <= 10]; nested exception is java.sql.SQLException: Invalid column name
  at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:235) ~[spring-jdbc-5.2.6.RELEASE.jar:5.2.6.RELEASE]
  at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) ~[spring-jdbc-5.2.6.RELEASE.jar:5.2.6.RELEASE]
  at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1443) ~[spring-jdbc-5.2.6.RELEASE.jar:5.2.6.RELEASE]
  at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:388) ~[spring-jdbc-5.2.6.RELEASE.jar:5.2.6.RELEASE]
  at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:452) ~[spring-jdbc-5.2.6.RELEASE.jar:5.2.6.RELEASE]
  at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:462) ~[spring-jdbc-5.2.6.RELEASE.jar:5.2.6.RELEASE]
  at org.springframework.batch.item.database.JdbcPagingItemReader.doReadPage(JdbcPagingItemReader.java:210) ~[spring-batch-infrastructure-4.2.2.RELEASE.jar:4.2.2.RELEASE]

最佳答案

感谢http://shanhe.me/2011/05/15/read-carefully-spring-jdbctemplate-bad-sql-grammar-exception ,我能够解决这个问题。

SQL 语法没有问题。

我发现我对表架构做了很小的更改。我重命名了一个专栏。我用来映射设备表的 RowMapper 仍然使用旧的列名,因此出现了问题。

给 Spring jdbc 团队的建议:当您抛出 ...jdbc.BadSqlGrammarException 时,您能否向用户建议他们的列映射可能是错误的。由于您没有对此错误进行任何跟踪记录,至少当您发现时,您可以建议可能存在映射错误。看来我不是唯一遇到这个问题的人。

关于java - Spring Batch 2.2.7 应用程序抛出 "Invalid column name"。非常简单的代码炸弹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62213361/

相关文章:

unit-testing - BeforeClass 使用 Spring 事务测试

java - 在 Java 中读取和解析任意 xml 结构?

java - 如何在java中使用MessageDigest类?

sql - 一张400GB表,一次查询——需要调优思路(SQL2005)

sql - 如何在 hibernate 条件中使用 group_concat?

java - 配置文件 - 在 Java 中将它们放在哪里?

Java效率: Object Assignment & Method Call vs.内联方法调用

java - 客户端套接字上的 setSoTimeout 不会影响套接字

没有这个子查询并且没有限制偏移量的Mysql优化

Spring PropertyPlaceholderConfigurer 和 MongoDB 副本集