4 Stimmen

Nhibernate - Fehler bei der Ausführung einer SQL-Abfrage

Ich führe eine SQL-Abfrage mit Nhibernate, unten ist der Code, in dem ich für diese verwenden:

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

Ich erhalte die folgende Fehlerinformation:

**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) 

Woran könnte es liegen? ---- Danke

3voto

Chris Marisic Punkte 31583

Sie haben NHibernate grundlegend missverstanden. NHibernate ist nicht wie die TypeDataSource-Klassen, die Ihnen DataSets/DataTables liefern, die keine echten Geschäftsobjekte sind.

NHibernate ist für die Arbeit mit vollständig eigenen Objekten gedacht, so dass Sie etwas Ähnliches wie

Public Class Document
{

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

Dann müssen Sie eine Mapping-Datei entweder manuell oder durch Code-Generierung für rohe HBM-Mappings erstellen oder ein Tool auf NH verwenden, um Mappings programmatisch mit FluentNHibernate oder ConfORM zu erstellen.

Sie müssen die Grundlagen von NHibernate lernen, bevor Sie versuchen, diese Abfrage ist eine anständige Einführung Post: http://www.fincher.org/tips/Languages/NHibernate.shtml

Und dann können Sie für die Abfrage verwenden http://www.castleproject.org/ActiveRecord/documentation/v1rc1/usersguide/hql.html als Referenz.

0voto

nicbua Punkte 1

Das Geheimnis ist die Verwendung:

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

En AddScalar müssen Sie Ihre NH-Typen für die Ausgabe definieren.

Siehe ref aquí

0voto

Maxim Eliseev Punkte 2848

In den meisten Fällen sollten Sie Entitätsobjekte anstelle von benutzerdefinierten Abfragen verwenden. Wenn Sie wirklich eine benutzerdefinierte Abfrage benötigen, könnte das folgende Beispiel nützlich sein

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X