26

@NamedQuery在休眠中使用over有什么好处,@NamedNativeQuery反之亦然。我无法发现确切的区别或我们应该在哪种情况下@NamedQuery使用@NamedNativeQuery

提前致谢。

4

3 回答 3

35

@NamedNativeQuery让您编写命名 SQL 查询,同时@NamedQuery让您编写命名 HQL 查询(或 JPQL)。

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

于 2012-12-19T14:54:21.080 回答
11

在考虑性能时,您必须了解引擎盖下发生的事情。

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

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

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

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

于 2012-12-19T14:59:35.773 回答
8

@NamedQuery应使用查询语言(HQL 或持久性查询语言)构建。 @NamedNativeQuery应使用本机 SQL 构建。

于 2012-12-19T14:54:17.450 回答