2012-02-17 81 views
0

我需要在這裏發佈問題之前,我傾向於找到答案,但今天我似乎無法找出什麼是錯的。LEFT JOIN的學說結果緩存錯誤...有條件

我們在Symfony 2應用程序中使用Doctrine 2.1.2,在存儲庫中我們有兩個使用幾乎相同查詢的方法。 方法A和方法B之間的唯一區別是,有一個條件添加到JOIN所共有的兩個查詢。

問題是,Doctrine似乎對兩個查詢都使用相同的結果緩存。 當我們調用方法A,方法B使用從A緩存,和周圍的其他方式。

我一直在使用expireResultCache(true)和useResultCache(false),無濟於事。

這裏的查詢是什麼樣子:

-- method A 

SELECT DISTINCT a, b, c FROM MyBundle:ObjectA a INDEX BY a.id 
LEFT JOIN a.fkObjectB b 
LEFT JOIN a.fkObjectC c 

-- method B 
SELECT DISTINCT a, b, c FROM MyBundle:ObjectA a INDEX BY a.id 
LEFT JOIN a.fkObjectB b WITH b.some_field IS NULL 
LEFT JOIN a.fkObjectC c 

當我使用getSQL(),我看到他們產生不同的查詢預期。生成的查詢,在數據庫independantly運行,請產生不同的結果。

這使我相信,它可能是一個惱人的結果緩存錯誤,其中主義不緩存條件的連接,但只有表名。

這是一個錯誤,或者有什麼我可以做的嗎?

編輯仍在發生的學說2.1.6。

回答

0

我覺得你這個問題是固定的學說2.2。我有類似的問題涉及到結果緩存,這裏是my question&answers

+0

萬一有人絆倒在這個老問題:椅子和鍵盤之間的問題撒謊。 我們沒有考慮到管理實體的數組集合屬性保持不變並且不會被連續查詢更新的事實。 – 2012-06-05 09:40:28

0

爲了擴展michel v's comment,Doctrine 2通過identity map pattern兩次獲取相同的對象實例。

呼叫:

EntityManager#clear() 

清除標識圖和強制的EntityManager從數據庫中獲取對象的新副本。