簡體   English   中英

Hibernate中的多態查詢

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM