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 также указывает на то, что кеш запросов никогда не видит эти пустые строковые параметры, а скорее фактические значения параметров с дефисами.

Мой вывод заключается в том, что профилировщик отображает эти параметры неправильно при перечислении кэшированного запроса.

Другие вопросы по тегам