from Paper as paper join fetch paper.authors as authors where authors.id='xxxx';
from Paper as paper join fetch paper.authors where paper.authors.id='xxxx';
這兩個語句有什么區別呢?通過最終生成的sql發現。
上面HQL生成最終sql(部分) from s_paper paper inner join s_paper_author author where author.paper_id=paper.id where author.id='xxx'
下面HQL生成最終sql(部分) from s_paper paper inner join s_paper_author author where author.paper_id=paper.id,s_paper_author author1 where author1.paper_id=paper.id and author1.id='xxx'
可以看出來,下面的多了一個關聯。那么問題來了,這兩個有什么區別呢?
通過測試發現,第一個sql最終查詢的結果,如果論文作者有多個,加上子表的查詢條件后,最終封裝到實體類里面的卻只有符合條件的一個子類(論文作者),但是少了一個關聯查詢,可以節省部分性能。
第二個sql最終查詢的結果,是無論有多少個作者,全部都封裝進來了。但是因為多關聯了一次表查詢,有部分性能損失。
綜上,可以根據具體的場景來選擇合適的關聯方式。