2009-04-28 4 views
4

Я использую базу данных, которая имеет странный формат даты. Я написал UserType для переноса стандартного .NET DateTime в/из странного формата, и он отлично работает.NHibernate: HQL и UserTypes как параметры запроса

Я обычно использовал запросы ICriteria, но решил попробовать IQuery с использованием HQL в этом проекте. Я столкнулся с проблемой, что запрос не переводит параметры в соответствующий UserType.

например:

IQuery query = session.CreateQuery("from OfflineShipmentLineItem as line join fetch line.Shipment as shipment join fetch line.Extension where shipment.ShipmentDate = :date"); 
query.SetParameter("date", date); 

return query.List<OfflineShipmentLineItem>(); 

Вышеприведенные взрывается, поскольку запрос на shipment.ShipmentDate заканчивает тем, что '4/28/2009 12:00:00' вместо формата UserType.

Если я вместо этого использовать ICriteria он работает отлично:

ICriteria criteria = session.CreateCriteria(typeof(OfflineShipmentLineItem)); 

criteria.SetFetchMode("Shipment", FetchMode.Eager); 
criteria.SetFetchMode("Extension", FetchMode.Eager); 

criteria.CreateAlias("Shipment", "shipment"); 

criteria.Add(Expression.Eq("shipment.ShipmentDate", date)); 

return criteria.List<OfflineShipmentLineItem>(); 

Все работает отлично, потому что дата переводится с помощью UserType для shipment.ShipmentDate.

Не хватает ли чего-то намека на HQL, что делать?

ответ

7

У меня нет времени попробовать себя, но попробуйте добавить и 3 аргументы SetParameter (IType). В качестве параметра используйте NHUtils.Custom (typeof (YourIUserType))

+0

Вы потрясающий, сработал! Я не уверен, как я это пропустил. Я решил, что должен быть способ помочь HQL выяснить, что делать. – anonymous

+0

Это поведение изменилось на «сделать правильную вещь» (действовать как «Критерии» и вызвать IUserType) в NH 2.1.2, но ваш совет решает мою проблему для 2.1.0 (что я застрял по разным причинам). Спасибо за это! –

Смежные вопросы