Oracle10gおよびSQLServer2008でNH3.3.1.4000を使用しています。
最近、このバグの可能性に遭遇しました。次の2つのクエリについて考えてみます。
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 = ''
渡され、「-」(ハイフン)を持つパラメーターは、実際のSQLクエリには到達しません。
パラメータの.CacheableまたはSetCacheable()または「-」を削除すると、正しく機能します。NHソースコードを調べ始める前の回避策について何かアイデアはありますか?ありがとう。
更新SQLServer にも同じ問題が存在することを確認できます。クエリキャッシュではなく、データベースとは何の関係もないと思います。クエリを最初に実行するとき、キャッシュが実行される前に、生成されるクエリは正しいことを述べておく必要があります。しかし、同じクエリを2回実行すると、今回はクエリキャッシュからの読み込みで、ハイフンでキャッシュできません。.NetMVCアプリでSQLServer2008を使用して実行した次のテストを参照してください。
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'
しかし、ページをリロードし、Query Cacheに処理を任せた後、次の3つのクエリを取得します。
-- 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'
ご覧のとおり、2回目のステートメント#1ではパラメーターが空です。ステートメント#1とステートメント#2の唯一の違いは、クエリキャッシュの使用です。キャッシュされたクエリは、パラメータに「-」ハイフンがない限り、2番目のロード(test3)で正常に機能します。