【发布时间】:2021-12-03 02:25:00
【问题描述】:
我正在使用 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 > 安装时,出现以下错误:
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 >= CURRENT DATE]
上面的查询怎么写?
【问题讨论】:
-
试试
CURRENT_DATE -
@GeorgeLvov 谢谢,这消除了上面的错误,但现在我得到 java.lang.IllegalArgumentException: Validation failed for query for public abstract java.util.List CarRepository.findAllNonExpiredCars(org .springframework.data.domain.Sort)!
-
把你的实体名而不是表名放在查询中,所以
CarEntity而不是CAR -
我明白了:)。因此,在
@Query中,我应该引用实体及其字段,而不是数据库表及其字段。一旦我将CAR(数据库表)替换为实体CarEntity,并将EXPIRY_DATE(数据库字段)替换为carEntity.expiryDate,它现在就可以工作了。谢谢你。您能否将您的 cmets 放入答案中,以便我接受您的答案。非常感谢@GeorgeLvov
标签: java spring-boot spring-data-jpa