【问题标题】:NHibernate: HQL and UserTypes as query parametersNHibernate:HQL 和 UserTypes 作为查询参数
【发布时间】:2017-01-01 02:29:43
【问题描述】:

我正在使用具有奇怪日期格式的数据库。我编写了一个 UserType 来将标准 .NET DateTime 传输到/从奇怪的格式传输,它工作正常。

我通常使用 ICriteria 查询,但决定在这个项目中尝试使用 HQL 的 IQuery。我遇到了一个问题,即查询没有将参数转换为适当的 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>();

由于对 shipping.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>();

一切正常,因为日期是使用用于 shipping.ShipmentDate 的 UserType 翻译的。

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

【问题讨论】:

    标签: nhibernate hql


    【解决方案1】:

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

    【讨论】:

    • 你太棒了,辛苦了!我不知道我是怎么错过的。我认为必须有一种方法可以帮助 HQL 弄清楚该怎么做。
    • 此行为在 NH 2.1.2 中更改为“做正确的事”(行为类似于 Criteria 并调用 IUserType),但您的提示解决了我的 2.1.0 问题(我坚持由于各种原因)。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 2019-12-06
    • 1970-01-01
    • 2022-10-16
    • 2019-06-14
    相关资源
    最近更新 更多