遇到“未定义别名”或“未知映射”;使用NHibernate'的多查询功能时的异常

本文关键字:异常 查询功能 NHibernate 未知映射 未定义别名 别名 未定义 未知 遇到 映射 使用 | 更新日期: 2023-09-27 17:53:40

我正在尝试使用NHibernate版本v2.0.50727实现一个典型的分页和计数功能的NHibernate的多查询功能。

我一直在遵循Ayende Rahien给出的示例,我的代码与它非常相似。但是,每次它调用以列表形式返回结果时,都会抛出一个异常,其中包含如下消息:

"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,文件?

遇到“未定义别名”或“未知映射”;使用NHibernate'的多查询功能时的异常

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

如果您想使用SQL而不是使用CreateQuery,您应该使用CreateSQLQuery方法。你可以复习一下手册的14-17章。可惜你使用的是旧版本,否则我建议你选择linq作为查询方法。

简而言之——替换

NHibernateSession.CreateQuery("select ..

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