注释 jpa @Query

问题描述

我正在学习 jpa 和 hibernate。我在存储库类中看到:

@Query(value = "FROM AccountTable")
List<Account> findAllAccount();

没有过滤器的情况下,@Query(value = "FROM AccountTable") 是否等于 select * from AccountTable?正确吗?

解决方法

首先,@Query 不是 jpa,而是 spring data jpa annotation

根据休眠documentation

JPQL 中的 select 语句与 HQL 完全相同,只是 JPQL 需要 select_clause,而 HQL 不需要。

因此,在您的问题查询中提到的具有 HQL 特定语法的内容等于以下 JPQL:

@Query("select a FROM AccountTable a")
List<Account> findAllAccount();

请注意,最后一个查询更清楚,建议作为一种好做法。

尽管 HQL 不需要存在 select_clause,但通常最好包含一个。对于简单查询,意图很明确,因此 select_clause 的预期结果{1}} 很容易推断。但对于更复杂的查询,情况并非总是如此。

通常最好明确指定意图。 即使在解析 JPQL 查询时,Hibernate 实际上也不会强制存在 select_clause,但是,对 JPA 可移植性感兴趣的应用程序应该注意这一点。