使用NamedParameterJdbcTemplate时命名参数引发SQL语法错误排查
命名参数替换后SQL语法错误问题
查遍所有相关问题仍未解决,已大幅简化代码复现这个问题:
正常运行的代码
@Repository public class MyFriend { @Autowired private NamedParameterJdbcTemplate namedParameterJdbcTemplate; public List<TransmitUnit> getTransmissionList(LocalDate workingDate) { List<TransmitUnit> retValue = null; String sql = "SELECT working_day as workingDate, origin_code as originCode FROM core.sort_transmission WHERE working_day = '2024-08-23'"; MapSqlParameterSource namedParameters = new MapSqlParameterSource(); namedParameters.addValue("working_day", workingDate.toString()); retValue = namedParameterJdbcTemplate.query(sql, namedParameters, new BeanPropertyRowMapper<>(TransmitUnit.class)); for (TransmitUnit u: retValue) { LOGGER.info("Got this tu {}", u.getWorkingDate()); } return retValue; } }
替换命名参数后的代码
将SQL语句中的硬编码日期'2024-08-23'替换为命名参数后:
String sql = "SELECT working_day as workingDate, origin_code as originCode " + "FROM core.sort_transmission WHERE working_day = :working_day";
触发的错误日志
ERRO class="MyFriend" method="getTransmissionList" transactionId="6913d8d6-d56a-4c8f-bd78-32c976817d39-1724878713995" request="[2024-08-28]" errorType="org.springframework.jdbc.BadSqlGrammarException" errorMsg="PreparedStatementCallback; bad SQL grammar [SELECT working_day as workingDate, origin_code as originCode FROM core.sort_transmission WHERE working_day = ?]" errorOrigin="org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:104)"
疑问
- 错误日志里的SQL显示为带
?占位符的预编译语句,而非我使用的命名参数:working_day - 之前用相同的命名参数写法一直正常,现在突然报错,找不到问题原因
注:已根据John Bollinger的评论提交了问题解答。
内容的提问来源于stack exchange,提问作者lopass
相关产品推荐
相关产品推荐

