【问题标题】:NHibernate Named Query Not Returning All FieldsNHibernate 命名查询不返回所有字段
【发布时间】:2015-08-04 20:56:43
【问题描述】:

我在 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&lt;object[]&gt;() 部分返回的对象数组列表只有 3 个元素。未返回 s.Description 字段。

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

【问题讨论】:

  • 您是否分析过 NHibernate 生成的 SQL?

标签: c# ms-access nhibernate group-by named-query


【解决方案1】:

我建议使用结果来代替 bean 转换器,这将是更简洁的代码。

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

【讨论】:

    【解决方案2】:

    感谢大家的帮助。原来问题实际上出在我的映射文件上:

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

    我添加了缺少的 &lt;return-scalar column="Description" type="string"/&gt; 元素以使其正常工作。

    我建议使用结果来代替 bean 转换器,这将是更简洁的代码。

    感谢 Alexey 的建议,我不知道你能做到这一点!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 2021-07-27
      • 2010-12-09
      相关资源
      最近更新 更多