[英]Polymorphic queries in Hibernate
通過閱讀《 Hibernate參考指南》,我發現:
14.8。 多態查詢
查詢如下:
from Cat as cat
返回的不僅是Cat的實例,而且還返回DomesticCat等子類的實例。 休眠查詢可以在from子句中命名任何Java類或接口。 該查詢將返回擴展該類或實現該接口的所有持久類的實例。 以下查詢將返回所有持久對象:
from java.lang.Object o
接口Named可以由各種持久性類實現:
from Named n, Named m where n.name = m .name
請注意,這最后兩個查詢將需要多個SQL SELECT。 這意味着order by子句不能正確地對整個結果集進行排序。 (這也意味着您不能使用Query.scroll()調用這些查詢。)
所以問題是,最后一個查詢將返回什么?
from Named n, Named m where n.name = m .name
它將是實現“命名”的所有對象的數組,所有對象都具有相同的“名稱”值,並且由於它是“雙重請求”
from Named n, Named m
這是否意味着數組的前半部分將在下半部分重復出現?
不,它不會在下半年重復出現,但是可能存在多個相等對象的實例
select * from a,a
僅計算笛卡爾乘積a和a(即,get的所有行與a的所有行連接),例如,如果表a僅包含一個id列且值為1,2,3,則上述查詢為您提供以下內容
select id from a,a where a.id = b.id
所以
+------+
| a.id |
|------|
| 1 |
| 2 |
| 3 |
+------+
退貨
+----+------+----+------+
| id | name | id | name |
+----+------+----+------+
| 1 | a | 1 | a |
| 2 | a | 1 | a |
| 1 | a | 2 | a |
| 2 | a | 2 | a |
| 3 | b | 3 | b |
+----+------+----+------+
因此,您的查詢將淘汰至少所有在數據庫中實現Named的對象,如果同一對象多次存在,可能還會重復。 隨着以下數據庫
+-------------+ | id | name | |-------------| | 1 | a | | 2 | a | | 3 | b | +-------------+
您的查詢給您
+----+------+----+------+ | id | name | id | name | +----+------+----+------+ | 1 | a | 1 | a | | 2 | a | 1 | a | | 1 | a | 2 | a | | 2 | a | 2 | a | | 3 | b | 3 | b | +----+------+----+------+
因此,由於兩個條目具有相同的名稱,因此第一個條目將與自身連接,另一個條目將與另一個條目連接,第二個條目也是如此,這意味着如果您有n個具有相同名稱的對象,hibernate將檢索每個對象n次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.