NHibernate:HQL和UserTypes作为查询参数

NHibernate:HQL和UserTypes作为查询参数,nhibernate,hql,Nhibernate,Hql,我使用的数据库有一个奇怪的日期格式。我编写了一个UserType来将标准的.NETDateTime转换成怪异的格式,它工作得很好 我通常使用ICriteria查询,但决定在这个项目上尝试使用HQL。我遇到了一个问题,查询没有将参数转换为适当的用户类型 例如: IQuery query=session.CreateQuery(“从OfflineShipmentLineItem作为行连接获取行。作为装运连接获取行的装运。扩展名where shipping.ShipmentDate=:date”);

我使用的数据库有一个奇怪的日期格式。我编写了一个UserType来将标准的.NETDateTime转换成怪异的格式,它工作得很好

我通常使用ICriteria查询,但决定在这个项目上尝试使用HQL。我遇到了一个问题,查询没有将参数转换为适当的用户类型

例如:

IQuery query=session.CreateQuery(“从OfflineShipmentLineItem作为行连接获取行。作为装运连接获取行的装运。扩展名where shipping.ShipmentDate=:date”);
query.SetParameter(“日期”,日期);
返回query.List();
由于对Shipping.ShipmentDate的查询以“4/28/2009 12:00:00”而不是用户类型格式结束,因此上述操作失败

如果我改用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>();
ICriteria criteria=session.CreateCriteria(typeof(OfflineShipmentLineItem));
条件.SetFetchMode(“装运”,FetchMode.Eager);
criteria.SetFetchMode(“扩展名”,FetchMode.Eager);
标准。CreateAlias(“装运”、“装运”);
添加(表达式Eq(“装运日期”,日期));
返回条件。List();
一切正常,因为日期是使用用户类型for Shipping.ShipmentDate转换的


我是否遗漏了一些提示HQL应该做什么的内容?

我没有时间亲自尝试,但尝试添加SetParameter的第三个参数(IType)。
作为参数,使用NHUtils.Custom(typeof(YourIUserType))

你真了不起,干得不错!我不知道我是怎么错过的。我认为必须有一种方法来帮助HQL确定该做什么。在NH2.1.2中,这种行为变为“做正确的事情”(像标准一样行事并调用IUserType),但您的提示解决了我在2.1.0中遇到的问题(我出于各种原因一直坚持这样做)。谢谢你!
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>();