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,我想查询我的结果并过滤它们。在 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