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

Spring Repository执行PostgreSQL原生SQL时::interval语法报错如何解决

问题解决方法

错误原因

Spring Data JPA 的 @Query 注解默认会将单冒号 : 识别为SQL命名参数的前缀,你所用的PostgreSQL特有的双冒号类型转换语法 ::interval 会被Spring的SQL解析器误识别为参数占位符,最终触发语法错误。

解决方案

推荐优先使用兼容性更高的标准SQL写法,无需处理转义:

方案1:使用CAST函数做类型转换

将 '1 hour'::interval 替换为标准SQL的CAST写法,修改后的完整代码如下:

@Repository
public interface OrderRepository extends CrudRepository<Orders, Long> {
    @Modifying
    @Transactional
    @Query(value = "DELETE FROM orders WHERE created_at < now() - CAST('1 hour' AS INTERVAL)",
        nativeQuery = true)
    void executeDelete();
}

方案2:直接使用INTERVAL关键字定义时间间隔

PostgreSQL支持直接用 INTERVAL '时间长度' 的语法定义时间间隔,写法更简洁:

@Repository
public interface OrderRepository extends CrudRepository<Orders, Long> {
    @Modifying
    @Transactional
    @Query(value = "DELETE FROM orders WHERE created_at < now() - INTERVAL '1 hour'",
        nativeQuery = true)
    void executeDelete();
}

方案3:转义双冒号(不推荐)

如果需要保留双冒号写法,可对冒号进行转义,不同版本Spring Data JPA转义规则略有不同:

  • 低版本使用双反斜杠转义:
@Query(value = "DELETE FROM orders WHERE created_at < now() - '1 hour'\\:\\:interval", nativeQuery = true)
  • 2.4及以上版本可使用三个连续冒号转义:
@Query(value = "DELETE FROM orders WHERE created_at < now() - '1 hour':::interval", nativeQuery = true)

内容的提问来源于stack exchange,提问作者user1285928

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:48:02