使用NHibernate的Multi Query功能时遇到“未定义的别名或未知映射”异常

时间:2015-06-06 01:12:19

标签: c# nhibernate nhibernate-mapping

我正在尝试使用NHibernate版本v2.0.50727为典型的分页和计数功能实现NHibernate的Multi Query功能。

我一直在关注Ayende Rahien给出的here示例,我的代码与它很相似。但是,每次遇到调用以将结果作为列表返回时,都会抛出异常,并显示以下消息:

        IList queryResults = NHibernateSession.CreateMultiQuery()
            .Add(dataQuery)
            .Add(countQuery)
            .List();

以下是代码中出现问题的步骤:

        private IList < SalesDetails > GetSalesByCustomer(Customer customer, DateTime start, DateTime end, int pageIndex, int pageSize, out int TotalCount)
     {
        IQuery dataQuery = NHibernateSession.CreateQuery("from Shop.dbo.Sales s where s.Customer = :customer_id and s.date between :start_date and :end_date order by s.date desc");
        dataQuery.SetInt32("customer_id", customer.ID);
        dataQuery.SetParameter("start_date", start);
        dataQuery.SetParameter("end_date", end);
        dataQuery.SetFirstResult(pageIndex);
        dataQuery.SetMaxResults(pageSize);

        IQuery countQuery = NHibernateSession.CreateQuery("select count(*) from Shop.dbo.Sales s where s.Customer = :customer_id and s.date between :start_date and :end_date");
        countQuery.SetInt32("customer_id", customer.ID);
        countQuery.SetParameter("start_date", start);
        countQuery.SetParameter("end_date", end);

        IList queryResults = NHibernateSession.CreateMultiQuery()
            .Add(dataQuery)
            .Add(countQuery)
            .List();

        IList < SalesDetails > results = (IList < SalesDetails > ) queryResults[0];
        TotalCount = (int)((IList) queryResults[1])[0];
        return results;
    }

以下是代码的其余部分:

AWS S3

您是否需要提供映射才能实现此功能?我不认为是这种情况,因为它被返回到通用列表,但如果是这样的话,你怎么会在Hibernate的映射文件中执行此操作,即hbm.xml文件?

1 个答案:

答案 0 :(得分:2)

您和您提供的链接中的Ayende正在使用CreateQuery方法在HQL中创建查询。这种类型的NH查询必须针对NH实体编写,这意味着您必须具有正确的映射,即Sales实体,然后在Ayende从select count(*) from Sale中选择时编写Item

如果要使用SQL而不是CreateQuery,则应使用CreateSQLQuery方法。您可以查看the manual的第14-17章。太糟糕了,你使用旧版本,或者我建议你让linq成为你选择的查询方法。

简而言之 - 替换

NHibernateSession.CreateQuery("select ..

NHibernateSession.CreateSQLQuery("select ..

或使用映射的实体名称而不是基于SQL表的标识符编写正确的HQL查询。