NHibernate Query кеш ошибка с дефисами
Я использую NH 3.3.1.4000 с Oracle 10g и SQL Server 2008.
Я столкнулся с этой возможной ошибкой недавно. Рассмотрим следующие два запроса:
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? Благодарю.
ОБНОВЛЕНИЕ Я могу подтвердить, что такая же проблема существует и для SQL Server. Я предполагаю, что это не имеет ничего общего с базой данных, а с кешем запросов. Я должен был упомянуть, что при первом запуске запроса, до того, как произойдет кэширование, сгенерированный запрос является правильным. Но когда я выполняю тот же запрос во второй раз, на этот раз загрузка из кеша запросов, кешируемых с дефисами, не работает. Пожалуйста, посмотрите следующий тест, который я провел с использованием SQL Server 2008 в приложении.Net MVC.
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 выполнить свою задачу, я получил следующие три запроса:
-- 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), если в параметре нет дефиса "-".
1 ответ
Кажется, это должно быть ошибкой в NHibernate Profiler, а не в NHibernate или кеше запросов. Мне удалось воспроизвести вашу проблему с параметрами, включая дефисы для кэшированных запросов, которые отображаются в профиле как пустые строки.
Тем не менее, я всегда получал правильные результаты в своих тестах. Включение уровня отладки для логгера NHibernate.Cache.StandardQueryCache
также указывает на то, что кеш запросов никогда не видит эти пустые строковые параметры, а скорее фактические значения параметров с дефисами.
Мой вывод заключается в том, что профилировщик отображает эти параметры неправильно при перечислении кэшированного запроса.