0

我正在处理 Java 中的 NamedParameterJdbcTemplate。我正在尝试通过 NamedParameterJdbcTemplate 将间隔参数(3 个月)传递给 sql 查询 DELETE FROM message WHERE dt_log <NOW () - INTERVAL ': period'; 我在 DAO 中为间隔参数传递了一个字符串类型的句点,并将其放入 mapSqlParameterSource.addValue ("period", period); 执行请求时,它会抛出以下错误:org.postgresql.util.PSQLException: ERROR: invalid input syntax for type interval: ': period',尽管我传递了正确的值“3 个月”(检查了整个请求pgAdmin)。我尝试以相同的方式将 PGInterval 对象传递给参数,但它给出了相同的错误。但是如果你不插入参数,请求本身就会起作用,但只需手动编写请求本身的时间间隔:'3 个月',如果您插入指向具有字符串类型的静态值的链接,其中在 sql 请求中指定了“3 个月”,则它可以工作。DAO 类代码如下所示。

private final String DELETE_OLD_ROWS = "DELETE FROM mood.message WHERE dt_log <NOW() - INTERVAL ':period';";

@Override
public void delete_old_records(String period) {
    MapSqlParameterSource mapSqlParameterSource = new MapSqlParameterSource();
    mapSqlParameterSource.addValue("period", period);
    this.getNamedParameterJdbcTemplate().update(this.DELETE_OLD_ROWS, mapSqlParameterSource);
}

也许有人可以告诉我我做错了什么?)

4

1 回答 1

0

您的问题的根本原因是在 Oracle SQL 中我们无法将值绑定到间隔参数。

相反,您可以查看NUMTODSINTERVAL NUMTOYMINTERVAL方法。他们可以被利用。

您在代码中的间隔规范

DELETE FROM mood.message WHERE dt_log <NOW() - INTERVAL ':period';

替换为 NUMTODSINTERVAL 或 NUMTOYMINTERVAL。

DELETE FROM mood.message WHERE dt_log <NOW() - NUMTOYMINTERVAL(:period, 'MONTH');
于 2022-02-16T12:57:58.837 回答