簡體   English   中英

Nhibernate - 獲取執行SQL查詢的異常

[英]Nhibernate - Getting Exception executing SQL Query

我正在使用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) 

可能是什么問題? - - 謝謝

你從根本上誤解了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作為參考。

秘訣是使用:

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

AddScalar您必須為輸出定義NH類型。

這里的參考

在大多數情況下,您應該使用實體對象而不是自定義查詢。 如果您確實需要自定義查詢,則以下示例可能很有用

    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; }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM