【发布时间】:2017-12-25 20:45:36
【问题描述】:
我正在学习休眠并阅读在线资料以了解这一点。
什么时候更倾向于使用 HQL(或 SQL)而不是 hibernate 提供的 OO 方式?也就是说,One 什么时候应该更喜欢 HQL 而不是 session.get()? (读操作)
谁能帮我理解这个?
【问题讨论】:
我正在学习休眠并阅读在线资料以了解这一点。
什么时候更倾向于使用 HQL(或 SQL)而不是 hibernate 提供的 OO 方式?也就是说,One 什么时候应该更喜欢 HQL 而不是 session.get()? (读操作)
谁能帮我理解这个?
【问题讨论】:
即使 Hibernate 是最常用的 JPA 实现,我也会坚持规范 API (JPA)。
所以EntityManager 而不是Session。
通常,您希望编写自己的查询,因为查询的复杂程度最低。
但是特定的 JPA/Hibernate 方法不允许执行这种查询。
这些方法只处理简单的情况。
因此,作为一般规则,您应该优先使用特定的 JPA/Hibernate 方法,而不是每次都创建自定义查询。
避免使用 JPQL 编写样板代码通常是一种捷径。
例如,如果您想从其 ID 中检索实体,那么您没有任何价值来编写如此简单的查询。
您将不得不编写样板代码(创建查询、设置参数查询、执行查询)。
使用EntityManager.find(Class<T>, Object) 是一种更简单、更清晰的方法,因为您无需进一步了解行为。
请注意,Spring Data JPA 更进一步,提供了更多方法来处理其他经典查询。
SimpleJpaRepository 类就是一个很好的例子。
最后请注意,在某些情况下,无法选择特定的 JPA/Hibernate 方法来操作实体。
与实体或EntityManager 状态相关的操作只能执行 使用这些方法(persist()、flush() 或 refresh()、clear()、...)。
【讨论】: