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
相关产品推荐
相关产品推荐

