2012-08-09 19 views
2

我使用NH 3.3.1.4000與Oracle 10g和SQL Server 2008.NHibernate用連字符查詢緩存錯誤

我最近遇到了這個可能的錯誤。考慮以下兩個查詢:

var query1 = session.Query<Content>().Cacheable() 
        .Where(c => c.Name == "test-test").ToList(); 

var query2 = session.CreateQuery("from Content c where c.Name = :name") 
        .SetString("name", "test-test") 
        .SetCacheable(true); 
var list = query.List<Content>(); 

無論是上述查詢會產生下面的SQL查詢之一:

select content0_.Id  as Id6_,  
content0_.Name as Name6_,  
from Content content0_ 
where content0_.Name = '' 

傳遞進來,並且具有任何參數「 - 」(連字符),沒有按如果我刪除參數中的.Cacheable或SetCacheable()或「 - 」,它可以正常工作。 在我開始查看NH源代碼之前有任何解決方法的建議? 謝謝。

UPDATE 我可以確認SQL Server也存在同樣的問題。我猜測它與數據庫無關,而與查詢緩存無關。 我應該提到,在第一次運行查詢之前,發生緩存之前,生成的查詢是正確的。但是當我第二次運行相同的查詢時,這次從查詢緩存中加載,用連字符緩存不起作用。請參閱我在.NET MVC應用程序上使用SQL Server 2008運行的以下測試。

var test1 = session.Query<Student>().Cacheable().Where(c => c.Firstname == "first-name").ToList(); 

var test2 = session.Query<Student>().Where(c => c.Firstname == "first-name").ToList(); 

var test3 = session.Query<Student>().Cacheable().Where(c => c.Firstname == "firstname").ToList(); 

我第一次加載生成以下查詢頁面,都是正確的:

-- statement #1 
select student0_.Id  as Id1_, 
    student0_.Firstname as Firstname1_, 
    student0_.Lastname as Lastname1_ 
from Students student0_ 
where student0_.Firstname = 'first-name' 

-- statement #2 
select student0_.Id  as Id1_, 
    student0_.Firstname as Firstname1_, 
    student0_.Lastname as Lastname1_ 
from Students student0_ 
where student0_.Firstname = 'first-name' 

-- statement #3 
select student0_.Id  as Id1_, 
    student0_.Firstname as Firstname1_, 
    student0_.Lastname as Lastname1_ 
from Students student0_ 
where student0_.Firstname = 'firstname' 

但我重新載入網頁後,讓查詢緩存做它的東西,我得到以下三個查詢:

-- statement #1 
Cached query: 
select student0_.Id  as Id1_, 
    student0_.Firstname as Firstname1_, 
    student0_.Lastname as Lastname1_ 
from Students student0_ 
where student0_.Firstname = '' 

-- statement #2 
select student0_.Id  as Id1_, 
    student0_.Firstname as Firstname1_, 
    student0_.Lastname as Lastname1_ 
from Students student0_ 
where student0_.Firstname = 'first-name' 

-- statement #3 
Cached query: 
select student0_.Id  as Id1_, 
    student0_.Firstname as Firstname1_, 
    student0_.Lastname as Lastname1_ 
from Students student0_ 
where student0_.Firstname = 'firstname' 

正如您所看到的,第二次在語句#1中該參數爲空。語句#1和語句#2之間的唯一區別是使用查詢緩存。只要參數中沒有「 - 」連字符,緩存查詢就可以在第二次加載(test3)中正常工作。

+0

這兩個查詢都會在SQL Server上生成正確的結果(我沒有Oracle方便)。你真的確定那些是你傳遞的價值嗎?這沒有多大意義。 – 2012-08-10 18:06:30

+0

即使數據庫是SQL Server,也存在此問題。當您第一次加載數據時,它可以正常工作,但是第二次加載數據(從查詢緩存中)問題很明顯。請參閱上面的更新與實際查詢。 – 2012-08-11 05:41:51

+0

這沒有意義。如果您正在緩存,則第二次完全沒有查詢。 – 2012-08-11 12:28:41

回答

0

看來這肯定是NHibernate Profiler中的一個bug,而不是NHibernate或查詢緩存。我已經能夠使用包含連字符的參數重現您的問題,以便在探查器中顯示爲空字符串的緩存查詢。

雖然我在測試中總是得到正確的結果集。爲記錄器NHibernate.Cache.StandardQueryCache啓用調試級別還表示查詢緩存永遠不會看到這些空字符串參數,而是帶有連字符的實際參數值。

我的結論是,在列出緩存查詢時,分析器不正確地顯示這些參數。