NHibernate和报告

时间:2010-05-09 10:46:46

标签: nhibernate reporting

我正在建立一个基于nhibernate的网站。有没有有效的方法来构建报告? BY报告,我的意思是,无论如何都要执行一个抓取随机数据的复杂查询?存储过程? HQL?

我可以从hql获取单个非映射值吗?

2 个答案:

答案 0 :(得分:2)

是的,你可以。

对于简单的东西,你可以使用HQL并选择一个新的非映射对象(它的类必须用NH“注册”,但本身没有映射)。 HQL语法看起来像 选择新的NonMappedClass(column1,column2)。您需要一个合适的构造函数来使用它。

使用HQL报告很快就会崩溃。我经常发现自己知道在SQL中要做什么,但很难搞清楚HQL方式。此外,缺乏真正的HQL软件工具会让您失望(对不起NH查询分析器并没有削减它)。在这些情况下,您可以使用关联定义raw。执行这些查询时,NH将返回一个Object数组的IList。您需要将Object()转换为正确的类型。您需要这个用于高级报告查询。

这种铸造材料容易出错并且耗费大量时间。所以你做了一个很好的AliasToBean查询转换器,可以将结果集列名映射到属性(名称必须匹配)。我不知道最新的NH版本,但旧的1.2.1 AliasToBean转换器似乎有一个错误,它会将可以为空的值类型转换为该类型的默认值,而不是将其设置为null。即:int?如果关联的DB字段为null,则为0而不是null。这阻止了我在某些情况下使用AliasToBean,我不得不手动映射。

最好的建议是不要陷入使用业务对象和循环执行复杂报告的陷阱。我在制作中见过这个。随着桌子尺寸的增大,这将是一种表现恐怖。

答案 1 :(得分:1)

是的,你可以这样做。它被称为动态实例化。 HQL中的语法是

select new MyClass(cust.age)
from customers cust

或者,与标准:

.SetProjection(Projections.ProjectionList()
    .Add(Projections.Name("cust.age"), "age")
.SetResultTransformer(Transformers.AliasToBean<MyClass>())

请记住,你必须在MyClass上有一个匹配的构造函数!