2015-06-06 14 views
2

我想要使用NHibernate版本v2.0.50727实现典型的分页和计数功能的NHibernate的多查询功能。使用NHibernate的多查询功能时遇到“未定义的别名或未知的映射”异常

我一直在遵循Ayende Rahien给出的here的例子,我的代码和它很相似。不过,每次它击中调用返回的结果列表,将抛出一个异常与线沿线的消息:

"undefined alias or unknown mapping: Shop [from Shop.dbo.Sales s where s.Customer = :customer_id and s.date between :start_date and :end_date order by s.date desc]" 

下面是在代码中的步骤,其中出现问题:

 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; 
    } 

你需要提供映射这个工作?我不认为是这样,因为它被返回到一个通用列表,但如果是这样的话,你甚至会在Hibernate的映射文件,即hbm.xml文件中做这些事情?

回答

2

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

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

总之 - 与

NHibernateSession.CreateSQLQuery("select .. 

更换

NHibernateSession.CreateQuery("select .. 

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

相关问题