2011-08-24 6 views
3

J'appelle une procédure stockée en tant que NamedQuery et cela fonctionne correctement. Les problèmes commencent lorsque j'essaie de charger un composant. La procédure stockée retourne un jeu d'enregistrements comme celui-ciNHibernate: procédure stockée et composant

[IDEmployee, EmployeeName, Ville, Pays]

Où IDEmployee et EmployeeName appartiennent à l'entité mappée et la ville et le pays sont d'un composant

vient ici le cartographie:

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

C'est le code que j'utilise pour appeler la procédure stockée:

<sql-query name="GetEmployeesByCompany"> 
    <return class="Employee"> 
     <return-property column="idemployee" name="IDEmployee" /> 
     <return-property column="employeename" name="EmployeeName" /> 
     <return-property column="city" name="City" /> 
     <return-property column="country" name="Country" /> 
    </return> 
    EXEC GetEmployeeByCompany:idcompany 
    </sql-query> 

Voici le code que j'utilise pour appeler le mémoire:

var result = 
    session<ISession>().GetNamedQuery("GetEmployeesByCompany") 
       .SetInt32("idcompany", companyId) 
       .List<Employee>().ToList(); 

Voici l'erreur que je reçois quand je lance mon application

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 

Si je retire de la carte du tout composant fonctionne bien. J'ai également essayé quelque chose avec return-property avec une colonne de retour imbriquée sans succès.

Un conseil? Je vous remercie!

+0

En note .. et il peut être beaucoup trop tard .. avez-vous regardé iBatis au lieu de NHibernate? Il est plus axé sur le travail avec des procédures stockées. –

+0

C'est une suggestion précieuse, je vais essayer dans un futur proche! – xtblitz

Répondre

4

J'ai dû faire face à ce problème dernièrement, c'est ainsi que j'ai pu sortir.

<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 

L'ordre que vous utilisez pour les champs à l'intérieur de la propriété de retour est très important, il doit correspondre à celui de l'ensemble de résultats. Il n'y a pas de documentation du tout, j'espère que cela peut vous aider!

+0

C'est l'affaire !!!! ça a marché!!!! – xtblitz

Questions connexes