在hibernate中使用@NamedQuery
而不是@NamedNativeQuery
是否有任何好处或反之亦然。
我无法发现确切的差异或
在哪种情况下,我们应该@NamedQuery
使用@NamedNativeQuery
提前致谢。
答案 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)
@NamedQuery
。 @NamedNativeQuery
应该使用本机SQL构建。