2013-03-14 65 views
3

getcreateQuery有什麼優勢?hibernate createQuery vs

我可以看到有可能在沒有解析HQL輕微的性能改進,但沒有任何其他主要的優勢,使用克服的createQuery?

回答

5

首先,這是更快輸入,是更可讀,並明確表達了意圖:通過ID得到的實體。基本上不可能發生錯誤,而在HQL查詢中可能會出現拼寫錯誤。

關於性能,主要優點是隻有當實體不在會話緩存中時才執行select語句。每次都會執行HQL查詢。如果你有二級緩存,如果實體已經在第二級緩存中,get()將避免完全執行查詢。

+0

所以,根據這個,你對'get'的表現不正確:http://stackoverflow.com/questions/5370482/whats-the-advantage-of-load-vs-get-在冬眠。看起來你實際上是在談論「負載」的表現。 – 2013-03-15 06:59:11

+0

沒有。 'get()'看看實體是否在會話緩存中。如果已經存在,則返回。否則,它會執行一個SQL查詢來加載它,將它放入會話緩存中,並將其返回。 'load()'檢查實體是否在會話緩存中。如果已經存在,則返回。否則,它創建一個懶惰的代理,甚至不檢查對象是否存在於數據庫中,並返回此代理。你爲什麼不自己檢查一下?打開SQL日誌記錄,然後進行試驗。 – 2013-03-15 07:02:55

+0

有趣的區別。我在哪裏可以閱讀更多關於此?我找到'get'信息的地方似乎都提到它「總是碰到數據庫」。他們是否都在重複相同的錯誤信息? – 2013-03-15 07:08:11

0

get()直接使用會話來檢索對象。

  • get()僅當您要加載對象(即SQL SELECT)時纔有用。
  • 像save()和persist()導致SQL INSERT,在SQL DELETE中刪除()SQL UPDATE中的update()或merge()。
  • 有限控制,我們需要指定一個我們需要提取的實體。

createQuery()使用HQL

  • 使用HQL我們可以編寫所有的CRUD查詢。
  • 給予更多控制,我們可以指定HQL(SQL like)子句。
  • HQL是自己的休眠查詢語言,它用於對休眠程序執行批量操作
  • SQL的一種面向對象的形式稱爲HQL。
  • 這裏我們打算用POJO類名稱和表名替換POJO類名稱的表列名稱以獲得HQL命令
  • 有時候很難用其他替代方法編寫。使用HQL我們可以更快地實現。
相關問題