命名参数出现错误的 SQL 语法错误 - 删除参数可以消除错误

问题描述 投票:0回答:2

我已经一一研究了所有其他问题,但我没有解决我的问题。 我已经大大简化了代码,并且我相信这是该问题的新颖演示。

此代码有效:

@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 显示

?
就好像这是一个通用的准备好的语句而不是带有命名参数。 我知道这以前有效,我不确定我可能做错了什么。

编辑:根据约翰·博林格的评论,我提交了一个答案,我认为它很好地说明了确切的类型问题,并且对未来的观众有启发。

java spring jdbctemplate
2个回答
0
投票

约翰·博林格是正确的。 Java 中的类型需要与 SQL 中的类型匹配。 删除 toString() 有效。

最终工作代码:

@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 = :working_day";
        MapSqlParameterSource namedParameters = new MapSqlParameterSource();
        namedParameters.addValue("working_day", workingDate);
        retValue = namedParameterJdbcTemplate.query(sql, namedParameters, new BeanPropertyRowMapper<>(TransmitUnit.class));
        for (TransmitUnit u: retValue) {
            LOGGER.info("Got this tu {}", u.getWorkingDate());
        }
        return retValue;
    }

0
投票
  1. 截断数据库日期类型以仅考虑日期部分。

  2. 从java传递localDate作为特定的字符串格式,然后在SQL查询中转换为日期。

String sql = "SELECT working_day as workingDate, origin_code as originCode FROM core.sort_transmission WHERE trunc(working_day) = ':working_day'";

MapSqlParameterSource namedParameters = new MapSqlParameterSource();

namedParameters.addValue("working_day", workingDate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy"));
© www.soinside.com 2019 - 2024. All rights reserved.