2014-01-19 38 views
2

雖然在行動(克里斯蒂娜·鮑爾&是Gavin King)讀取休眠我碰到下面的部分排在第7章Hibernate的多態查詢

7.2.3多態查詢 我們描述HQL作爲一種面向對象的查詢語言,所以應該支持多態查詢 - 即分別查詢類的實例和其子類的所有實例。你已經知道足夠多的HQL,我們可以證明這一點。考慮以下查詢:

從BillingDetails

該查詢返回的類型BillingDetails,它是一個抽象類的對象。因此,在這種情況下,具體對象屬於BillingDetails的子類型:CreditCard和BankAccount。如果我們只想要一個特定的子類的實例,我們可以使用

從信用卡式

在FROM子句中命名的類並不需要是一個映射持久化類;任何班級都會這樣做。下面的查詢返回所有的持久化對象:從java.io.Serializable接口

從java.lang.Object繼承

當然

,這也適用於接口,該查詢返回所有序列化的持久對象

標準查詢也支持多態:

session.createCriteria(BillingDetails.class).list();

該查詢返回BillingDetails及其子類的實例。同樣,以下條件查詢返回所有持久對象:

session.createCriteria(java.lang.Object.class).list();

多態性不僅適用於在from子句中明確命名的類,而且也適用於多態關聯,如稍後將看到的。

問題:多態查詢有什麼用處。如何以及何時使用。

+1

從您發佈的內容來看,這不是很明顯嗎?假設您需要所有賬單細節(不論其類型是什麼)(信用卡或銀行賬戶):您無需爲每個具體子類發出一個w-query:選擇BillingDetails的單個查詢就足夠了。 –

回答

-2

java beats爲多態查詢發佈了一個很好的答案。

http://javabeat.net/implicit-polymorphism-hibernate/

更新:我的壞,忘了提,他們使用的實例講解多態查詢,這裏有雲:

假設我們有兩個類類:CreditCardPayment和DebitCardPayment且二者擴展了Payment超類,並且這三個類中的每一個在數據庫中都有它們自己的表,因爲已經使用了table per class strategy。在某個時間點,如果我們想要檢索通過現金或卡進行的所有付款的列表,下面的查詢將會發揮魔力。

session.createCriteria(Payment.class)。名單();

在處理這個條件查詢,休眠執行以下操作 -

確定支付的所有子類,它被映射到任何表 消防單個查詢到所有的表 的結合所有的查詢結果爲列表並從休眠層返回

儘管hibernate在內部執行它,但我們確實只需要一個查詢即可獲取這兩種類型卡的所有數據。因此,hql中使用的查詢是多態的。