Nhibernate с NativeSQL - PullRequest
       1

Nhibernate с NativeSQL

0 голосов
/ 08 октября 2011

Мой sql:

SELECT Branch.BranchName, Department.DepartmentName, 
       Designation.DesignationName,   EmpType.EmpType, Shift.ShiftName,
       Employee.CardNo,Employee.EmployeeStatus, Employee.JoiningDate, Employee.EmpName
FROM   Branch 
          INNER JOIN Department ON Branch.BranchId = Department.BranchId 
          INNER JOIN Designation ON Branch.BranchId = Designation.BranchId 
             AND Department.DepartmentId = Designation.DepartmentId 
          INNER JOIN Employee ON Branch.BranchId = Employee.BranchId 
             AND Department.DepartmentId = Employee.DepartmentId 
             AND Designation.DesignationId = Employee.DesignationId 
          INNER JOIN EmpType ON Employee.EmpTypeId = EmpType.EmpTypeId 
          INNER JOIN Shift ON Employee.ShiftId = Shift.ShiftId

Код доступа к данным:

IQuery query = Session.GetISession().CreateSQLQuery(sql).AddEntity(typeof(Branch));
return query.List<Branch>();

Трассировка стека:

at System.Data.SqlClient.SqlDataReader.GetOrdinal(String name)
at NHibernate.Driver.NHybridDataReader.GetOrdinal(String name)
at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name)
at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String[] names,   SessionImplementor session, Object owner)
at NHibernate.Loader.Loader.GetKeyFromResultSet(Int32 i, ILoadable persister, Object id, IDataReader rs, ISessionImplementor session)
at NHibernate.Loader.Loader.GetRowFromResultSet(IDataReader resultSet, ISessionImplementor session, QueryParameters queryParameters, LockMode[] lockModeArray, EntityKey optionalObjectKey, IList hydratedObjects, EntityKey[] keys, Boolean returnProxies)

at NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
at NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies)
at NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters)

Существует несколько объектов DomainObject выше (например, филиал, отдел, EmpType, назначение и сотрудник). но я хотел бы вернуть тип списка объекта Branch.

Пожалуйста, кто-нибудь подскажет мне, каково было бы решение.

Спасибо Rusho

1 Ответ

1 голос
/ 08 октября 2011

Если вы хотите использовать CreateSQLQuery над собственным оператором sql, в любом случае вы должны указать Nhibernate, какой объект вы хотите выбрать, потому что Nhibernate работает в терминах объектов или объектов, а затем напишите оператор sql следующим образом:

SELECT {Entity.*}, Department.DepartmentName, 
   Designation.DesignationName,   EmpType.EmpType, Shift.ShiftName,
   Employee.CardNo,Employee.EmployeeStatus, Employee.JoiningDate, Employee.EmpName
FROM Branch {Entity}
      INNER JOIN Department ON {Entity.BranchId} = Department.BranchId 
      INNER JOIN Designation ON {Entity.BranchId} = Designation.BranchId 
         AND Department.DepartmentId = Designation.DepartmentId 
      INNER JOIN Employee ON Branch.BranchId = Employee.BranchId 
         AND Department.DepartmentId = Employee.DepartmentId 
         AND Designation.DesignationId = Employee.DesignationId 
      INNER JOIN EmpType ON Employee.EmpTypeId = EmpType.EmpTypeId 
      INNER JOIN Shift ON Employee.ShiftId = Shift.ShiftId

тогда вам нужно сообщить запросу имя этой сущности следующим образом:

CreateSQLQuery(sql).AddEntity("Entity", typeof(Branch))

, но использование собственного SQL-запроса, подобного этому, не очень хорошая идея, потому что здесь возникает красота Nhibernate.это то, для чего мы должны использовать NHibernate, чтобы исключить эти массивные SQL-операторы и выразить наши таблицы в некоторой разновидности ООП. Для базового запроса, подобного этому, лучше использовать HQL Язык запросов или QueryOver . Посмотрите в своем выражении sql, сколько строк вы написали, но с помощью Nhibernate вы можете сделать это с помощью нескольких слов, вы можете использовать собственный оператор sql только для запросов, которых не удалось достичь с помощью NHibernate.

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