Spring JPA @Query JPQL 失败 "Unexpected token: DATE"

Spring JPA @Query JPQL fails with "Unexpected token: DATE"

我正在使用 Spring Data JPA,我想查询我的结果并过滤它们。在 SQL 中,我会像这样编写查询(针对 DB2 数据库):

SELECT * FROM CAR 
WHERE ACCIDENT_YEAR IS NULL 
  OR BUY_YEAR >= CURRENT_DATE 
ORDER BY CAR_NUMBER

使用 Spring JPA,我正在尝试使用 @Query 注释和 JPQL 来做同样的事情,如下所示:

@Repository
public interface CarRepository extends JpaRepository<CarEntity, Integer> {
    
    @Query("SELECT c FROM CAR c WHERE c.EXPIRY_DATE IS NULL OR c.EXPIRY_DATE >= CURRENT DATE")
    List<CarEntity> findAllNonExpiredCars(Sort sort);
}

,然后我可以像这样调用此方法:

carRepository.findAllNonExpiredCars(Sort.by("CAR_NUMBER"));

但是,当我执行 Maven > Install 时,出现以下错误:

NoViableAltException:意外标记:DATE

,以及

org.hibernate.hql.internal.ast.QuerySyntaxException:意外标记:DATE 靠近第 1 行,第 84 列 [SELECT c FROM CAR c WHERE c.EXPIRY_DATE IS NULL OR c.EXPIRY_DATE >= 当前日期]

如何编写上面的查询?

如果您想使用 @Query 注释定义查询,您可以使用 JPQL-query(查询定义默认使用它)或原生 SQL(使用 nativeQuery = true ). SQL 使用关系数据库表、记录和字段,而 JPQL 使用 Java 类 和对象。

在你的例子中,你混合了这两种选择。你可以这样做:

JPQL:

public interface CarRepository extends JpaRepository<CarEntity, Integer> {
    
    @Query("SELECT c FROM CarEntity c WHERE c.expiryDate IS NULL OR c.expiryDate >= CURRENT_DATE")
    List<CarEntity> findAllNonExpiredCars(Sort sort);
}

原生 SQL:

public interface CarRepository extends JpaRepository<CarEntity, Integer> {
    
@Query("SELECT * FROM schema_name.CAR WHERE EXPIRY_DATE IS NULL OR EXPIRY_DATE >= CURRENT_DATE ORDER BY some_field_name",
        nativeQuery = true)
List<CarEntity> findAllNonExpiredCars();
}

看看这些链接:

Spring Data JPA - Reference Documentation. Query Methods

Spring Data JPA @Query. Baeldung

Types of JPA Queries. Baeldung