come utilizzare una stored procedure in NHibernate
-
23-10-2019 - |
Domanda
Ciao Io cerco di usare stored procedure in NHibernate e ho trovato alcuni metodi:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<sql-query name="CO_Visites_Treeview_Sel">
exec CO_Visites_Treeview_Sel :Idclient, :Idmagasin, :Autre, :Tous
</sql-query>
</hibernate-mapping>
Se voglio utilizzare i dati userò:
var query = session.GetNamedQuery("CO_Visites_Treeview_Sel");
query.SetString("Idclient", lstClients.SelectedValue.ToString());
query.SetInt32("Idmagasin", 36);
query.SetBoolean("Autre", false);
query.SetBoolean("Tous", true);
var results = query.List();
In questo caso io non avrà né Intellisence risultato [ 'colName']
Io uso un altro metodo:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="NHibernate.DataAccess.Models.Visites_Treeview,NHibernate.DataAccess" lazy="true">
<id name="Idvisite" column="IDVISITE" type="string">
<generator class="assigned" />
</id>
<property column="NOMMAGASIN" name="Nommagasin" type="string" />
<property column="DATEVIS" name="Datevis" type="DateTime" />
<property column="INTERVENTION" name="Intervention" type="Boolean" />
<property column="IDFACTURE" name="Idfacture" type="string" />
<property column="STATUT" name="Statut" type="byte" />
<property column="NOFACTURE" name="Nofacture" type="int" />
<property column="NODEVIS" name="Nodevis" type="int" />
<property column="LIVRE" name="Livre" type="Boolean" />
<property column="NOCOMMANDE" name="Nocommande" type="int" />
<property column="COMPTABILISEE" name="Comptabilisee" type="Boolean" />
<property column="RECUP" name="Recup" type="Boolean" />
<property column="MASQUE" name="Masque" type="Boolean" />
</class>
<sql-query name="CO_Visites_Treeview_Sel">
<return alias="Visites_Treeview" class="NHibernate.DataAccess.Models.Visites_Treeview,NHibernate.DataAccess">
<return-property column="NOMMAGASIN" name="Nommagasin" />
<return-property column="IDVISITE" name="Idvisite" />
<return-property column="DATEVIS" name="Datevis" />
<return-property column="INTERVENTION" name="Intervention" />
<return-property column="IDFACTURE" name="Idfacture" />
<return-property column="STATUT" name="Statut" />
<return-property column="NOFACTURE" name="Nofacture" />
<return-property column="NODEVIS" name="Nodevis" />
<return-property column="LIVRE" name="Livre" />
<return-property column="NOCOMMANDE" name="Nocommande" />
<return-property column="COMPTABILISEE" name="Comptabilisee" />
<return-property column="RECUP" name="Recup" />
<return-property column="MASQUE" name="Masque" />
</return>
exec CO_Visites_Treeview_Sel :Idclient, :Idmagasin, :Autre, :Tous
</sql-query>
</hibernate-mapping>
Ho creato una classe bean. In questo caso i risultati saranno oggetto fortemente tipizzato, ma ho qualche problema coerenza. Ma non ho nessun vero identificatore quindi se c'è due Idvisite, il secondo verrà ignorato. Ho cercato di creare una chiave composta, ma non funziona.
<composite-id>
<key-property name="Idvisite" column="IDVISITE" type="string" />
<key-property name="Idfacture" column="IDFACTURE" type="string" />
</composite-id>
E ho un errore:
could not execute query
[ exec CO_Visites_Treeview_Sel @p0, @p1, @p2, @p3 ]
Name:Idclient - Value:036000004130 Name:Idmagasin - Value:36 Name:Autre - Value:False Name:Tous - Value:True
[SQL: exec CO_Visites_Treeview_Sel @p0, @p1, @p2, @p3]
Qualcuno può dirmi come fare?
Saluti
Soluzione
Try this, your mapping:-
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<sql-query name="CO_Visites_Treeview_Sel">
exec CO_Visites_Treeview_Sel :Idclient, :Idmagasin, :Autre, :Tous
</sql-query>
</hibernate-mapping>
use SetResultTransformer...
var results = Session
.GetNamedQuery("CO_Visites_Treeview_Sel")
.SetString("Idclient", lstClients.SelectedValue.ToString())
.SetInt32("Idmagasin", 36)
.SetBoolean("Autre", false)
.SetBoolean("Tous", true)
.SetResultTransformer(new AliasToBeanResultTransformer(typeof(YOURCLASS)));
return results.List<YOURCLASS>();
and YOURCLASS is:-
public class YOURCLASS
{
public virtual int ColA { get; set; }
public virtual string COLB { get; set; }
public virtual int COLC { get; set; }
// etc..
}
HTH
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow