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!
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. –
C'est une suggestion précieuse, je vais essayer dans un futur proche! – xtblitz