簡體   English   中英

Spring JPA @Query JPQL 失敗並顯示“意外令牌:日期”

[英]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:意外標記:日期附近第 1 行,第 84 列 [SELECT c FROM CAR c WHERE c.EXPIRY_DATE 為 NULL 或 c.EXPIRY_DATE >= CURRENT 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 - 參考文檔。 查詢方法

Spring Data JPA @Query。 貝爾東

JPA 查詢的類型。 貝爾東

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM