@NamedQuery over @NamedNativeQuery

时间:2012-12-19 14:51:31

标签: java hibernate annotations hql

在hibernate中使用@NamedQuery而不是@NamedNativeQuery是否有任何好处或反之亦然。 我无法发现确切的差异或 在哪种情况下,我们应该@NamedQuery使用@NamedNativeQuery

提前致谢。

3 个答案:

答案 0 :(得分:31)

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

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

答案 1 :(得分:8)

在进行表演时,你必须了解一些有关幕后内容的信息。

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

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

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

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

答案 2 :(得分:5)

应使用查询语言(HQL或持久性查询语言)构造

@NamedQuery@NamedNativeQuery应该使用本机SQL构建。