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

Spring JPA @Query写JPQL报错Unexpected token: DATE如何解决

错误根因

你遇到的语法错误核心是JPQL中当前日期的关键字写法错误,JPQL规范里获取当前系统日期的关键字是连写的CURRENT_DATE,你写的CURRENT DATE中间加了空格,不符合HQL/JPQL语法要求,因此编译阶段就抛出了未知token异常。

除此之外还有2个常见的JPQL写法易错点需要修正:

  • JPQL查询的主体是实体类而非数据库表,所以FROM后面要写你定义的实体类名CarEntity,不能直接写数据库表名CAR
  • JPQL中字段引用的是实体类的属性名,不是数据库表的列名;同理Sort.by()方法的入参也要填实体类的属性名,不能直接填数据库列名

修正后的完整代码

1. JPQL写法

@Repository
public interface CarRepository extends JpaRepository<CarEntity, Integer> {
    
    // 假设实体类中对应BUY_YEAR列的属性名为buyYear,对应ACCIDENT_YEAR列的属性名为accidentYear
    @Query("SELECT c FROM CarEntity c WHERE c.accidentYear IS NULL OR c.buyYear >= CURRENT_DATE")
    List<CarEntity> findAllNonExpiredCars(Sort sort);
}

方法调用:

// 假设实体类中对应CAR_NUMBER列的属性名为carNumber
carRepository.findAllNonExpiredCars(Sort.by("carNumber"));

2. 原生SQL写法(可选)

如果更习惯写原生SQL,可以开启nativeQuery参数,直接写数据库原生语法,不需要遵循JPQL规范:

@Query(value = "SELECT * FROM CAR WHERE ACCIDENT_YEAR IS NULL OR BUY_YEAR >= CURRENT_DATE ORDER BY CAR_NUMBER", nativeQuery = true)
List<CarEntity> findAllNonExpiredCars();

这个写法不需要额外传Sort参数,排序逻辑直接写在原生SQL里即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 10:24:00