2014-12-02 41 views
-1

我有一個名爲Customer接口的接口選擇,這兩個類CustomerImplOwnerCustomerImpl都實現了這個接口,那麼我有一個HQL像"select customer from Customer customer where customer.username=:username",所以這是什麼HQL的結果呢?什麼HQL的結果,從中有兩個實現的類

我總是得到CustomerImpl的對象,但我真的想得到OwnerCustomerImpl

我也看了像DOC:

14.8。多態查詢

喜歡的查詢:

從貓的貓

收益情況不僅有,而且還的貓類DomesticCat子類。 Hibernate查詢可以在from子句中命名任何Java類或接口。該查詢將返回擴展該類或實現接口的所有持久類的實例。下面的查詢將返回所有的持久化對象:

從java.lang.Object繼承Ø

命名可能被各種各樣的持久化類實現的接口:

從的N個命名,命名m,其中n.name = m.name

這最後兩個查詢將需要多個SQL SELECT。這意味着order by子句不能正確排序整個結果集。這也意味着你不能使用Query.scroll()調用這些查詢。

我認爲,結果應該包括這兩個類,所以有人可以幫助解釋這個?

+0

尋求調試幫助的問題(「**爲什麼不是這個代碼工作?」)必須包括所需的行爲,_specific問題或錯誤_和__必須的最短代碼_在問題本身**中重現** 。沒有**明確問題陳述**的問題對其他讀者沒有用處。請參閱:[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 – icza 2014-12-02 06:53:33

回答

0

是的,根據Hibernate,應該返回CustomerImplOwnerCustomerImpl實例。檢查是否爲這兩個類保留了實例。

另外檢查你是否真的實現了相同的接口(而不是另一個包)。

還要檢查,如果結果不是一個完整的列表(例如只是第一個X元素),因爲如果結果是有限的,因爲引述你的Hibernate可以後選擇先返回CustomerImpl情況下,符合條件的,包括OwnerCustomerImpl

此外,它可能是你根本沒有任何OwnerCustomerImpl持續實例匹配您的查詢條件。

+0

非常感謝icza! 我已經檢查過所有你說過的話,它們都正確設置。並且我還調試了代碼,結果列表只包含一個對象是CustomerImpl。 – johnson 2014-12-02 07:30:31

+0

我想讓你知道,OwnerCustomerImpl實際上是擴展了CustomerImpl,並實現了帶有名爲「message」的新字段的Customer,例如「public class OwnerCustomerImpl extends CustomerImpl implements Customer」,策略是「@Inheritance(strategy =」InheritanceType。 JOINED)「,所以在DB中有一個名爲」customer「的表,而另一個名爲」owner_customer「的表只包含一列」message「,並且在這些表之間有外鍵(customer_id),所以你認爲這是這個問題的原因是什麼? – johnson 2014-12-02 07:36:12

+0

hello icza,能否請你給我更多的幫助解決這個問題?謝謝! – johnson 2014-12-05 01:45:28

相關問題