NHibernate:存储过程和组件

NHibernate:存储过程和组件,nhibernate,stored-procedures,nhibernate-mapping,Nhibernate,Stored Procedures,Nhibernate Mapping,我将一个存储过程作为NamedQuery调用,它正在工作 好的 当我尝试加载一个组件时,问题就开始了。 存储过程返回如下所示的记录集 [IdeEmployee,EmployeeName,城市,国家] 其中IDEEmployee和EmployeeName属于映射实体,城市和国家/地区来自组件 下面是映射: <class name="Employee" table="employees"> <id name="IDEmployee"> <colu

我将一个存储过程作为NamedQuery调用,它正在工作 好的 当我尝试加载一个组件时,问题就开始了。 存储过程返回如下所示的记录集

[IdeEmployee,EmployeeName,城市,国家]

其中IDEEmployee和EmployeeName属于映射实体,城市和国家/地区来自组件

下面是映射:

<class name="Employee" table="employees"> 
    <id name="IDEmployee"> 
      <column name="idemployee" /> 
      <generator class="native" /> 
    </id> 
    <property name="EmployeeName "> 
      <column name="employeename" /> 
    </property> 
    <component name="Address" class="Address"> 
      <property name="City"> 
        <column name="city" /> 
      </property> 
      <property name="Country"> 
        <column name="country" /> 
      </property> 
    </component> 
  </class> 
如果我从地图上删除该组件,一切正常。 我还尝试了带有嵌套返回列的return属性,但没有成功


有小费吗?谢谢大家!

我最近不得不面对这个问题,这是我可以出来的方式

<sql-query name="GetEmployeesByCompany">
  <return class="Employee">
    <return-property column="idemployee" name="IDEmployee" />
    <return-property column="employeename" name="EmployeeName" /> 
    <return-property name="Address">  <!-- name of the component -->
      <return-column name="city" />  <!-- name of the resultset field -->
      <return-column name="country" />  <!-- name of the resultset field -->
    </return-property>
</return> 
EXEC GetEmployeeByCompany:idcompany 

执行官GetEmployeeByCompany:idcompany


return属性中字段的使用顺序非常重要,它必须与resultset中的顺序匹配。周围没有任何文档,我希望这可以帮助您

作为旁注。。而且可能太晚了。。你看过iBatis而不是NHibernate吗?它更侧重于使用存储过程。这是一个宝贵的建议,我将在未来尝试!
 var result = 
    session<ISession>().GetNamedQuery("GetEmployeesByCompany") 
                .SetInt32("idcompany", companyId) 
                .List<Employee>().ToList(); 
System.IndexOutOfRangeException: t1_282_0_ 
   at System.Data.SqlClient.SqlDataReader.GetOrdinal(String name) 
   at NHibernate.Type.NullableType.NullSafeGet(IDataReader rs, String name) 
in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Type\NullableType.cs:line 236 
   at NHibernate.Persister.Entity.AbstractEntityPersister.Hydrate(IDataReader rs, Object id, Object obj, ILoadable rootLoadable, String[][] suffixedPropertyColumns, Boolean allProperties, ISessionImplementor session)
in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Persister\Entity\AbstractEntityPersister.cs:line 2508
   at NHibernate.Loader.Loader.LoadFromResultSet(IDataReader rs, Int32 i, Object obj, String instanceClass, EntityKey key, String rowIdAlias, LockMode lockMode, ILoadable rootPersister, ISessionImplementor session) 
in d:\CSharp\NH\NH\nhibernate\src\NHibernate\Loader\Loader.cs:line 991 
<sql-query name="GetEmployeesByCompany">
  <return class="Employee">
    <return-property column="idemployee" name="IDEmployee" />
    <return-property column="employeename" name="EmployeeName" /> 
    <return-property name="Address">  <!-- name of the component -->
      <return-column name="city" />  <!-- name of the resultset field -->
      <return-column name="country" />  <!-- name of the resultset field -->
    </return-property>
</return> 
EXEC GetEmployeeByCompany:idcompany