2011-05-04 49 views
0

時,會出現令人討厭的N + 1問題。在執行與另一個聯合實體的聯接時執行criteria.list時,查看我的N + 1查詢的詳細描述。 現在我很無知,也許有人會有一個想法。當調用criteria.List()

這些對象:(正常改名:)) 訂單 - >鍋< - >封面

訂單多到一個相關的鍋。 (所以不同的命令可以指向同一個Pot)。 訂單表有一個「PotId」字段(帶有Pot表的關鍵字)。

Pot是一對一,雙向與Cover相關 - 一方是「一對一」,另一方是「多對一」。 封面有一個「PotId」字段(帶Pot table的鍵)。

問題開始於執行時: session.CreateCriteria(typeof(Order))。CreateAlias(「pot」,「pot」,JoinType.LeftOuterJoin).List();

我得到的是一個查詢獲取訂單+ pots,然後N個查詢獲取封面(通過cover.PotId)。 試圖調整這種方式和其他,但無濟於事。 我認爲這可能與「沒有延遲加載一對一關聯」, 有關,但我無法繞過它。 有什麼想法?將很樂意提供更多信息。

回答

0

嘗試設置你的batch-sizeCover實體的東西> 1.當它關係到獲得第一個Cover,它應該加載由現有Pot實體,高達batch-size極限引用的其他任何人。

+0

我可以試試,但我更喜歡O(1)DB往返和O(1)查詢的解決方案。 – 2011-05-05 05:30:37

1

我想你想要在pot和cover之間指定第二個別名/ join(或者在你的映射中加載pot - > cover關係)。

還有一個關於ICriteria的SetFetchMode,你可能會感興趣。

+0

我認爲提前獲取適當的封面,但查詢是動態生成的,這使得它更加困難。我也想過要加載pot-> cover關係,但在現實生活中,Order也指向Pot(多對一),並且在同一個表上有兩個連接 - 我仍然看到一些實體在加載後這個查詢(很奇怪,不知道爲什麼)。我也使用SetFetchMode(和另一個CreateCriteria),但我看到或多或少相同的結果... – 2011-05-04 20:11:30