何时使用HQL over Hibernate OO方法?

何时使用HQL over Hibernate OO方法?,hibernate,jpa,hql,Hibernate,Jpa,Hql,我正在学习hibernate并阅读在线资料来了解这一点 与hibernate提供的OO方式相比,何时更倾向于使用HQL(或SQL)?也就是说,什么时候应该选择HQL而不是session.get()?(读取操作) 有人能帮我理解这一点吗?即使Hibernate是最常用的JPA实现,我还是坚持使用规范API(JPA) 因此EntityManager而不是Session 一般来说,您希望编写自己的查询,因为查询的复杂程度最低。 但是特定的JPA/Hibernate方法不允许执行这种查询。这些方法只处理

我正在学习hibernate并阅读在线资料来了解这一点

与hibernate提供的OO方式相比,何时更倾向于使用HQL(或SQL)?也就是说,什么时候应该选择HQL而不是session.get()?(读取操作)


有人能帮我理解这一点吗?

即使Hibernate是最常用的JPA实现,我还是坚持使用规范API(JPA)
因此
EntityManager
而不是
Session

一般来说,您希望编写自己的查询,因为查询的复杂程度最低。
但是特定的JPA/Hibernate方法不允许执行这种查询。
这些方法只处理简单的情况。

因此,一般来说,每次创建自定义查询时,您都应该支持特定的JPA/Hibernate方法。
这通常是避免使用JPQL编写锅炉铭牌代码的捷径。
例如,如果您想从实体的ID中检索实体,那么您手头就没有任何值来编写如此简单的查询。
您必须编写锅炉板代码(创建查询、设置参数查询、执行查询)。
使用
EntityManager.find(Class,Object)
是一种更简单、更清晰的方法,因为您无需进一步了解行为。

请注意,SpringDataJPA通过提供更多的方法来处理其他经典查询,走得更远。
这门课就是一个很好的例子。


最后,请注意,在某些情况下,操作实体的特定JPA/Hibernate方法不是选择。
与实体或
EntityManager
state相关的操作只能使用这些方法执行(
persist()
flush()
refresh()
clear()
,…).

谢谢你的回答。如果不是HQL,我要求对HQL、JPQL进行更一般的描述。使用HQL、JPQL而非实体检索方式还有其他原因吗?欢迎:)“使用HQL、JPQL而非实体检索方式还有其他原因吗?”可能还有其他一些情况,但这些都是特殊情况。