Java spring@Query注释中的HQL查询
我一直在试图理解HQL和JPQL之间的区别。hibernate文档位于 建议JPQL需要编写select,但HQL中不需要。但当我尝试在spring数据JPA的查询注释中编写HQL或JPQL时,HQL和JPQL都可以工作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
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。我不知道为什么文档说明了一些不同的东西。我会检查它。谢谢。你的解释有道理