2012-06-25 61 views
2

我們使用QueryDSL現在我們的數據庫查詢,但我認爲這個問題是更普遍的冬眠相關..Hibernate:在HQL/QueryDSL中使用單個連接語句初始化所有子項?

我想知道:是否HQL把我查詢到休眠上下文/緩存,以便實體他們可以從那裏訪問?我在想,如果我爲一個實體運行一個大的leftjoin,顯式地收集所有的子關係,我應該可以節省延遲加載,如果我可以告訴hibernate在將結果映射到我的實體對象時使用該信息。我只是不知道如何..

例如: A有Bs和B有Cs。現在,如果我建立我的查詢fetch all一定A和也與B和C(查詢DSL implemenentation)加入吧:

List<A> as = query.from(QA.a).leftJoin(QA.a.b,QB.b).leftJoin(QB.b.c,QC.c).where(a.id.eq("1)).fetchAll(); 

我會得到,說

select... from A inner join B ... inner join C ... where ... 

所以一個很好的SQL語句結果應該是足夠的休眠初始化

as.get(index).getBs() 
as.get(index).getBs().get(index).getCs() 

,但它不會做,而是將運行查詢

select ... from B where B.aId = ?? 

是否有可能通過初始化一個實體與所有孩子一個連接或我希望太多來減少這些惰性加載?

如果我用連接加載所有數據,hibernate是否會將它們放入其緩存中,並且它是否會訪問該緩存以用於這些延遲加載或將輪詢數據庫?我有沒有發言權,還是完全不在我手中?

Thanks @ all!

回答

1

對不起,我忘了提到這一點我的帖子。我確實嘗試使用fetch,但沒有成功。原來的解決辦法是使用

@Fetch(FetchMode.JOIN) 

在實體屬性。

+0

您是否試過左連接/取不帶別名參數? –

+0

不,沒有嘗試過..如果我不使用別名,源代碼和查詢將膨脹起來...但我會試一試。根據關係,我使用innerJoin和leftJoin。 – Pete

4

在HQL查詢,您需要使用fetch關鍵字做到這一點:

select a from A a left join fetch a.cs b left join fetch b.cs where ... 

這在Hibernate documentation是很好的解釋。

我從來沒有用過QueryDSL,但根據its documentation,你只需要每個後致電fetch()方法加入到添加此獲取關鍵字:

query.from(QA.a).leftJoin(QA.a.b,QB.b).fetch().leftJoin(QB.b.c,QC.c).fetch().where...