@NamedQuery 优于 @NamedNativeQuery

Posted

技术标签:

【中文标题】@NamedQuery 优于 @NamedNativeQuery【英文标题】:@NamedQuery over @NamedNativeQuery 【发布时间】:2012-12-06 22:55:20 【问题描述】:

在休眠中使用@NamedQuery 而不是@NamedNativeQuery 有什么好处,反之亦然。 我无法发现确切的差异或 在什么情况下我们应该使用@NamedQuery 而不是@NamedNativeQuery

提前致谢。

【问题讨论】:

【参考方案1】:

@NamedNativeQuery 允许您编写命名 SQL 查询,而 @NamedQuery 允许您编写命名 HQL 查询(或 JPQL)。

一般来说,您应该更喜欢编写 HQL 查询,因为这样您就可以让 Hibernate 处理将 HQL 转换为各种 SQL 方言的复杂问题。当您选择切换 DBMS 提供商时,这将使您的工作变得更加简单。

【讨论】:

【参考方案2】:

在考虑性能时,您必须了解幕后的情况。

您可能已经使用简单的 JDBC 编写了一些程序,因此您知道如何查询 传递给驱动程序并发送到数据库。使用 HQL 或 JPA-QL 时,查询首先具有 解析成数据库可以理解的SQL语言。在这种情况下,我们有一个额外的 解析步骤之间。请注意,本机 SQL 查询,包括存储过程调用,持久性 框架仍然负责将 JDBC 结果集映射到持久对象的图形。

如果您想包含一个原生 SQL 提示来指示数据库管理系统查询优化器, 例如,您需要自己编写 SQL。 HQL 和 JPA-QL 没有关键字。

将本机 SQL 放入映射元数据的缺点是失去了数据库可移植性,因为 您的映射以及因此您的应用程序将仅适用于特定数据库。但通常这是一个 小问题,因为您可能没有创建一个必须在每个数据库上工作的框架。

当您想要落后于查询的性能时,您确实必须咨询数据库 并查看执行计划 - DBA 可以准确地告诉您什么是好的,什么可以优化。

【讨论】:

【参考方案3】:

@NamedQuery 应该使用查询语言(HQL 或持久性查询语言)构造。 @NamedNativeQuery 应该使用原生 SQL 构造。

【讨论】:

以上是关于@NamedQuery 优于 @NamedNativeQuery的主要内容,如果未能解决你的问题,请参考以下文章

在控制器的条件内调用 namedQuery

如何在 JPA 中使用 NamedQuery

@NamedQuery : FROM 子句中未定义标识变量“sysdate”

使用 eclipselink 和 @namedquery 进行错误转换

JPA 计数 NamedQuery

我应该使用 @NamedQuery 注释还是 addNamedQuery 方法?