@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 : FROM 子句中未定义标识变量“sysdate”