2012-11-08 52 views
7

我在一個使用JPA ORM的項目中工作,框架提供了兩種創建查詢的方法。爲什麼我們需要創建原生查詢?

  • entityManager.createQuery(query1);
  • entityManager.createNativeQuery(query2);

我明白查詢字符串的種類將被傳遞使用它們,但我不知道爲什麼我們需要創建本機查詢?可能我們不想在那裏使用ORM功能?

回答

11

除非需要,否則不需要創建本機查詢。 JPQL最終被框架翻譯成SQL,但框架允許您也調用本地查詢。爲什麼要這樣做:

  • 低級訪問,這意味着您可以自己優化和處理映射;用SQL實際訪問數據庫表,而用JPQL訪問實體對象;
  • 也許你不想學習JPQL如果你已經知道SQL
  • 你已經寫在SQL查詢,並沒有資源/時間將它們移植到JPQL
9

createQuery使用JPA自己的查詢語言,您可以從類名中選擇而不是表名。這不是SQL,它只是類似的,後來轉換爲真正的SQL。映射到java類將自動完成,實際的類實例將作爲結果返回。

createNativeQuery使用真正的SQL,並且將無法使用JPA功能。如果您需要執行JPA不支持的非常奇怪的操作,通常會使用此方法。 Object []的列表將被返回,映射到java對象將不得不手動完成。換句話說,它就像在JPA之前使用數據庫一樣工作,因爲連接處理是自動完成的,所以稍微方便一點。

4

我已經用它用於優化目的。使用本機查詢意味着ORM映射不適用,而不是使用JPQL,而是使用數據庫的本地語法。因此,正如@RasmusFranke所指出的那樣,如果你需要JPA不支持的東西(比如當你想使用數據庫供應商特定的擴展時,這在概念上是一個壞主意,因爲JPA是關於數據庫不可知的,但仍然發生。我知道...)

這樣做的其他影響是通過使用原生查詢,只運行提供的查詢。沒有渴望獲取其他實體或其他不需要的東西。這樣,如果你處理大量的對象,你可以節省一些堆空間。