Nhibernate - получение исключения при выполнении SQL-запроса - PullRequest
4 голосов
/ 20 апреля 2010

Я выполняю SQL-запрос с использованием Nhibernate, ниже приведен код, который я использую для этого:

 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) 

В чем может быть проблема? ---- Спасибо

Ответы [ 3 ]

3 голосов
/ 20 апреля 2010

Вы в корне неправильно понимаете 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 для справки.

0 голосов
/ 17 октября 2013

В большинстве случаев вы должны использовать объекты-сущности вместо пользовательских запросов. Если вам действительно нужен пользовательский запрос, может пригодиться следующий пример

    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; }
    }
0 голосов
/ 17 июля 2013

Секрет использования:

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

В AddScalar вы должны определить типы NH для вывода.

См. Ссылку здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...