You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 05:26:18