有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring JPA@Query JPQL因“意外标记:日期”而失败

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

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

对于Spring JPA,我正尝试使用@Query annotation和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>;安装后,我发现以下错误:

NoViableAltException:意外标记:日期

,及

org。冬眠hql。内部的阿斯特。QuerySyntaxException:意外标记:第1行第84列附近的日期[从c车中选择c,其中c.expiration\u DATE为空或c.expiration\u DATE>;=当前日期]

我如何写上面的查询


共 (1) 个答案

  1. # 1 楼答案

    如果要使用@Query注释定义查询,可以使用JPQL查询(查询定义默认使用它)或本机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