我已经一一研究了所有其他问题,但我没有解决我的问题。 我已经大大简化了代码,并且我相信这是该问题的新颖演示。 此代码有效:
@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传递localDate作为特定的字符串格式,然后在SQL查询中转换为日期。
String sql =“从 core.sort_transmission WHERE trunc(working_day) = ':working_day'中选择工作日作为工作日期,origin_code作为originCode”;
MapSqlParameterSource 命名参数 = new MapSqlParameterSource();
namedParameters.addValue(“working_day”,workingDate.format(DateTimeFormatter.ofPattern(“dd-MM-yyyy”));
约翰·博林格是正确的。 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;
}