簡體   English   中英

左聯接獲取和預取

[英]Left join fetch and prefetching

我有一個問題,當我們從A中選擇Select DISTINCT A之類的查詢時,左連接獲取ab JPA將帶來對象A的填充,並且對象b與a的oneToMany關系將被預取。 確切的說是預取,因為當我調試該對象時,它具有空值,並且數據庫中有數據,因此我假設它是一個代理對象。 代理是否包含從數據庫中預取的任何數據,並且僅在我實際調用a.getB()。size()之類的方法時才填充在ab上?

我以為如果使用“左連接提取”,則不需要調用a.getB()。size(),但是如果我不這樣做,則對象b將保留為代理,然后在在表示層中,如果任何對象調用b的任何屬性,則存在一個nullpointer。

我可能還要補充一點,即此b對象被映射為延遲加載,這就是為什么我畢竟使用fetch的原因。 :)另外,即使我使用“左連接提取”並調用a.getB()。size(),也不會進行任何附加查詢嗎? 預取將負責獲取b的所有數據,...它只需要我調用一個方法,以便它將數據從代理傳輸到實際對象?

在此先感謝您的解釋,這真的讓我感到困擾。

這取決於您的JPA實施。

據我所知,至少使用EclipseLink,如果使用聯接提取,則該屬性將始終被實例化,絕不會為null。

這可能是DISTINCT子句的問題,因為這里您具有A-> B之類的映射,所以在結果集中,您可能會有多個A代表B。使用Set集合填充數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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