我使用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)中正常工作。
這兩個查詢都會在SQL Server上生成正確的結果(我沒有Oracle方便)。你真的確定那些是你傳遞的價值嗎?這沒有多大意義。 – 2012-08-10 18:06:30
即使數據庫是SQL Server,也存在此問題。當您第一次加載數據時,它可以正常工作,但是第二次加載數據(從查詢緩存中)問題很明顯。請參閱上面的更新與實際查詢。 – 2012-08-11 05:41:51
這沒有意義。如果您正在緩存,則第二次完全沒有查詢。 – 2012-08-11 12:28:41