NHibernate命名查询不返回所有字段

本文关键字:字段 返回 查询 NHibernate | 更新日期: 2023-09-27 18:06:26

我在Forecast.hbm.xml中定义了以下命名查询:

SELECT 
    c.ForecastedYear,
    s.Description,
    Sum(c.NumTrees) AS NumTrees
FROM 
    EcoForecasts AS f INNER JOIN 
    (EcoForecastCohorts AS c INNER JOIN EcoStrata AS s ON s.StrataKey = c.StratumKey) 
    ON f.ForecastKey = c.ForecastKey
WHERE 
    f.ForecastKey = :guid
GROUP BY 
    c.ForecastedYear,
    c.StratumKey,
    s.Description
ORDER BY 
    s.Description,
    c.ForecastedYear;

我在c#文件NumTreesByStrataReport.cs中像这样调用查询:

IList<Result> results = _input.GetNamedQuery("NumTreesByStrata")
                              .SetGuid("guid", _iSess.ForecastKey.Value)
                              .List<object[]>()
                              .Select(result => new Result {
                                  Year     = Convert.ToInt16(result[0]),
                                  Strata   = Convert.ToString(result[1]),
                                  NumTrees = Convert.ToInt64(result[2])
                              })
                              .ToList();
return results;

然而,这段代码抛出了一个IndexOutOfRangeException,因为.List<object[]>()部分返回的是一个只有3个元素的对象数组列表。未返回s.Description字段。

如果我在数据库引擎(Microsoft Access)中运行SQL查询,则返回所有3列。为什么NHibernate不能做数据库可以做的并返回所有选定的字段?

NHibernate命名查询不返回所有字段

我建议使用result to bean转换器,这样代码会更简洁。

return _session.GetNamedQuery("NumTreesByStrata")
    .SetGuid("guid", forecastKeyValue)
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result)))
    .List<Result>();

谢谢大家的帮助。事实证明,问题实际上是与我的映射文件:

    <sql-query name="NumTreesByStrata">
        <return-scalar column="ForecastedYear" type="Int16"/>
        <return-scalar column="NumTrees" type="Int64"/>
        <![CDATA[
          SELECT c.ForecastedYear,
          ...
        ]]>
    </sql-query>

我添加了缺失的<return-scalar column="Description" type="string"/>元素使其工作。

我建议使用result to bean转换器,这样代码会更简洁。

谢谢你的建议,Alexey,我不知道你可以这样做!