如何运行使用nHibernate返回未映射对象列表的HqlBasedQuery?

时间:2009-03-04 19:45:14

标签: nhibernate castle-activerecord

我想对两个表(碰巧在ActiveRecord中映射)运行查询。查询返回无法映射到ActiveRecord对象的结果列表(因为它是自定义聚合信息)。

例如

Dim query_str as string =“选择不同的d.ID,(从Sales_Leads中选择count(1)作为exp,其中date_created< =:todays_date)作为来自经销商的NbrLeads d”

Dim q As Queries.HqlBasedQuery = New Queries.HqlBasedQuery(GetType(ICollection),query_str) q.SetParameter(“todays_date”,DateTime.Today) Dim i As ICollection = ActiveRecordMediator.ExecuteQuery(q)

我正在寻找的是简单的SQL执行,而不返回ActiveRecord对象。

所以,理想情况下,我可以查看集合中每个项目的i(“NbrResults”)。

我得到的错误是:

  

您已访问过ActiveRecord   那个不合适的班级   初始化。唯一的解释是   那叫   ActiveRecordStarter.Initialize()   没有包括   System.Collections.ICollection类

3 个答案:

答案 0 :(得分:2)

嗯,这是很久以前的问题,但我有一个合适的答案。

public static IList<T> ExecuteQuery<T>(HqlBasedQuery query)
    where T : new()
{
    query.SetResultTransformer(new NHibernate.Transform.AliasToBeanResultTransformer(typeof(T)));
        var results = (ArrayList)ActiveRecordMediator.ExecuteQuery(query);

    List<T> list = new List<T>(results.Count);
    for (int i = 0; i < results.Count; i++)
    {
        list.Add((T)results[i]);
    }

    return list;
}

这将返回类型为T的结果。类型T可以是任何你想要的。类型T需要一个无参数构造函数,它需要与您构建的查询中的列名或别名匹配的公共字段或属性。

我们一直这样做。特别是当您想在HQL中使用聚合函数来生成聚合数据时。

配套功能允许您将查询作为字符串以及您可能拥有的任何位置参数传递:

public static IList<T> ExecuteQuery<T, U>(string hqlQuery, params object[] parameters)
        where T : new()
    {
        return ExecuteQuery<T>(new HqlBasedQuery(typeof(U), hqlQuery, parameters));
    }

类型U是任何有效的ActiveRecord类型。它甚至不必是您引用的类型之一。如果你想要你可以替换它,你知道某些类型会在会话中有效并抛弃额外的参数。

答案 1 :(得分:0)

这是我的最终解决方案:

Dim query_str As String =“SELECT DISTINCT d.ID,count(l)从LEAD作为l join l.Dealer as d其中l.DateCreated&gt; = DATEADD(day,-30,:todays_date)GROUP BY d。 ID“

然后获取活动记录会话(或NHibernate,甚至不知道这里返回的内容):

Dim sess As ISession = activerecordmediator.GetSessionFactoryHolder()。CreateSession(GetType(ActiveRecordBase))

Dim q As NHibernate.IQuery = sess.CreateQuery(query_str)

q.SetParameter(“todays_date”,DateTime.Today) Dim i As IList = q.List()'得到结果

在.aspx页面中,可以在GridView中访问结果,如下所示:

答案 2 :(得分:0)

你正在走出NHibernate范例以调用SQL,这有点违背了ORM的精神。它本身并不“糟糕”,但如果我能够尝试保持更宽松的耦合,我肯定会避免破坏抽象。

您可以使用直接HQL查询执行所需操作,该查询将返回包含查询结果的元组集合。我在这里解释了如何做到这一点

Custom query with Castle ActiveRecord

你可能想看一下。即使您在新建HQLBasedQuery时必须指定类型,NH也足够聪明,知道如果您不选择类型实例,它应该根据对象元组组装结果集。

(IMNSHO它仍然有点不纯 - 我很想尝试将这种关系建模为一个对象并相应地映射它,但是我必须将DB压缩成适合对象模型的形状和在所有情况下都不会飞。)