SpringJDBC的JdbcTemplate在MySQL5.7下不支持子查詢的問題


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的源碼來調查。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM