2012-12-19 136 views
21

在冬眠或反之中使用@NamedQuery而不是@NamedNativeQuery有什麼好處。 我不能當場在方面,我們應該提前用@NamedQuery超過@NamedNativeQuery@NamedQuery over @NamedNativeQuery

得益於準確的區別或 。

回答

28

@NamedNativeQuery可讓您編寫指定的SQL查詢,而@NamedQuery可讓您編寫指定的HQL查詢(或JPQL)。

通常,您應該更喜歡編寫HQL查詢,因爲這樣您可以讓Hibernate處理將HQL轉換爲各種SQL方言的複雜過程。當您選擇切換DBMS提供程序時,這將使您的工作更加簡單。

4

@NamedQuery應該用查詢語言(HQL或持久性查詢語言)構造。應該使用原生SQL構建@NamedNativeQuery

7

當考慮到表現時,你必須瞭解一些有關發生的事情。

您可能使用簡單的JDBC編程了一些東西,因此您知道如何將查詢 傳遞給驅動程序併發送到數據庫。當使用HQL或JPA-QL時,查詢首先將 分解爲數據庫可以理解的SQL語言。在這種情況下,我們有一個額外的 解析步驟。請注意,Native SQL查詢(包括存儲過程調用),持久性框架 仍然負責將JDBC結果集映射到持久對象的圖形。

如果您想要包含一個本機SQL提示以指示數據庫管理系統查詢優化程序,例如,您需要自己編寫SQL。 HQL和JPA-QL沒有關鍵字。

將原生SQL放入映射元數據中的缺點是數據庫可移植性丟失,因爲 映射以及您的應用程序僅適用於特定數據庫。但通常這是一個小問題,因爲您可能沒有創建必須在每個數據庫上工作的框架。

如果您想要獲得查詢的性能,您必須查閱數據庫 並查看執行計劃 - DBA可以準確地告訴您什麼是好的,哪些可以優化。