Java spring@Query注释中的HQL查询

Java spring@Query注释中的HQL查询,java,spring,hibernate,spring-data-jpa,Java,Spring,Hibernate,Spring Data Jpa,我一直在试图理解HQL和JPQL之间的区别。hibernate文档位于 建议JPQL需要编写select,但HQL中不需要。但当我尝试在spring数据JPA的查询注释中编写HQL或JPQL时,HQL和JPQL都可以工作 import java.util.List; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; p

我一直在试图理解HQL和JPQL之间的区别。hibernate文档位于

建议JPQL需要编写select,但HQL中不需要。但当我尝试在spring数据JPA的查询注释中编写HQL或JPQL时,HQL和JPQL都可以工作

import java.util.List;

import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;

public interface UserRepository extends CrudRepository<User, Long> {
    
    @Query(value = "from com.demo.spring.data.jpa.User u")
    public List<User> findAllUsersHQL();
    
    @Query(value = "select u from com.demo.spring.data.jpa.User u")
    public List<User> findAllUsersJPQL();
}
import java.util.List;
导入org.springframework.data.jpa.repository.Query;
导入org.springframework.data.repository.crudepository;
公共接口UserRepository扩展了Crudepository{
@查询(value=“from com.demo.spring.data.jpa.User u”)
公共列表findAllUserSQL();
@查询(value=“从com.demo.spring.data.jpa.User u中选择u”)
公共列表findAllUsersJPQL();
}
我的理解是,既然查询注释是针对JPA的,为什么支持HQL

或者让我换个说法-


我们可以在查询注释中编写HQL吗?spring数据JPA是否同时支持这两种功能?

我认为这取决于您使用的JPA实现

尽管Spring数据表示它支持JPQL,但Spring数据本身并没有实现任何用JPQL验证和实现查询的功能

Spring将依赖于底层的JPA implementation,它将验证给定的JPQL查询并将其转换为普通SQL

如果底层适配器是一个,那么它很可能支持HQL,并且不会将应用程序限制为JPQL

此外,正如上面提到的jdicker,JPQL是HQL的一个子集,或者换句话说,hibernate提供了比JPA更多的功能。。因此,只要使用HibernateSA作为底层JPA引擎,就应该能够解析spring数据中的HQL


DIY-你可以尝试设置一个断点,自己确认行为。

我不能完全回答你的问题,但我至少可以告诉你JPA查询工作的原因。在第一句中的文档中:
一个JPQL查询始终是一个有效的HQL查询,但是反过来就不是了。
。因为它是一个有效的HQL(带和不带select),所以它也是一个有效的JPQL。我不知道为什么文档说明了一些不同的东西。我会检查它。谢谢。你的解释有道理