org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; bad SQL grammar [ SELECT * FROM `AAAA` Z LEFT JOIN (SELECT * FROM `BBBB` where targetdate >= 20150901) M ON Z.TargetDate = M.TargetDate...];
nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'DB名.*' doesn't exist at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:231) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:645) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:680) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:712) at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:722) at org.springframework.jdbc.core.JdbcTemplate.queryForRowSet(JdbcTemplate.java:859)
從上面的ErrorLog中可以看出,通過JdbcTemplate的queryForRowSet方法執行包含有子查詢的SQL語句時發生異常。
SpringJDBC版本為4.2.5-Release,相同的語句在測試環境的MySQL上執行無誤,但在生產環境的MySQL5.7版本中,發生上述異常。
排錯過程:
1,針對常見的表名大小寫問題進行調查發現MySQL配置無誤。
2,修改SQL去除子查詢后執行無誤。
3,直接通過phpMyAdmin執行該條包含子查詢的語句也執行無誤。
4,切換為JavaJDBC實現代碼后,該包含子查詢的語句也執行無誤。
由此大致可以推斷是JdbcTemplate本身的問題。
具體原因需要深入到SpringJDBC4.2.5的源碼來調查。