【问题标题】:Nhibernate - Getting Exception executing SQL QueryNhibernate - 执行 SQL 查询时出现异常
【发布时间】:2010-04-20 05:43:20
【问题描述】:

我正在使用 Nhibernate 执行 SQL 查询,下面是我用于此的代码:

 public ArrayList getDocumentsForApproval(string ReleaseId)
    {
        string query = string.Format("SELECT distinct doc.Id, doc.Name as Doc, doc.url as url, suser.Name as Author, ds.name, CONVERT(VARCHAR(11), doc.DateEntered, 101) as DateEntered FROM dbo.Documents doc INNER JOIN DevelopmentSteps ds ON doc.TypeId = ds.Id INNER JOIN DocumentTrackingItems dti ON doc.Id = dti.DocumentId INNER JOIN TrackingItems ti ON dti.ItemStepId = ti.Id INNER JOIN dbo.Releases rl ON ti.ReleaseId =  rl.BugTrackerName left outer join (select * from users) as suser on doc.AuthorUserid = suser.Id WHERE doc.DateEntered IS NOT NULL AND doc.DateApproved IS NULL AND rl.ID = '{0}'", ReleaseId);
        ISession session = NHibernateHelper.GetCurrentSession();
        ArrayList document =(ArrayList) session.CreateSQLQuery(query).List();
        return document;
    }

我收到的错误信息如下:

**Exception Details:**
NHibernate.QueryException: Return types of SQL query were not specified [SELECT      distinct doc.Id, doc.Name as Doc, doc.url as url, suser.Name as Author, ds.name, CONVERT(VARCHAR(11), doc.DateEntered, 101) 

可能是什么问题? ---- 谢谢

【问题讨论】:

    标签: c# asp.net nhibernate fluent-nhibernate sql


    【解决方案1】:

    您从根本上误解了 NHibernate。 NHibernate 不像 TypeDataSource 类,它们返回不是真正的业务对象的 DataSets/DataTables。

    NHibernate 旨在处理完全拥有的对象,因此您将拥有类似于

    Public Class Document
    {
    
        public virtual decimal Id { get; set; }
        public virtual string Name { get; set; }
        public virtual DateTime DateEntered { get; set; }
        ... so forth  
    }
    

    然后您需要手动或通过代码生成为原始 HBM 映射创建映射文件,或使用 NH 之上的工具通过 FluentNHibernate 或 ConfORM 以编程方式构建映射。

    在尝试查询之前,您需要学习 NHibernate 的基础知识,这是一篇不错的介绍性帖子:http://www.fincher.org/tips/Languages/NHibernate.shtml

    然后查询可以使用http://www.castleproject.org/ActiveRecord/documentation/v1rc1/usersguide/hql.html作为参考。

    【讨论】:

      【解决方案2】:

      在大多数情况下,您应该使用实体对象而不是自定义查询。 如果您确实需要自定义查询,以下示例可能有用

          public IEnumerable<GeoAreaIdAndCode> ReadAllGssCodes()
          {
              var query = "select GeoAreaID,Code from GeoAreaAlternativeCode where AlternativeCodeType=" + (int)GeoAreaAlternativeCodeType.GssCode;
              var result = Owner.Session.CreateSQLQuery(query)
                                      .AddScalar("GeoAreaID",NHibernateUtil.Int32)
                                      .AddScalar("Code",NHibernateUtil.String)
                                      .SetResultTransformer(Transformers.AliasToBean(typeof (GeoAreaIdAndCode)))
                                      .List<GeoAreaIdAndCode>();
      
              return result;
          }
      
          public class GeoAreaIdAndCode
          {
              public int GeoAreaID { get; set; }
              public string Code { get; set; }
          }
      

      【讨论】:

        【解决方案3】:

        秘诀在于使用:

        CreateSQLQuery("Your query with alias").AddScalar(...)
        

        AddScalar 中,您必须定义您的 NH 类型以进行输出。

        参见参考文献here

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-24
          • 1970-01-01
          相关资源
          最近更新 更多