Utilizzando una query denominata in una HBM con classe di importazione
-
22-09-2019 - |
Domanda
Nel mio server MSSQL ho una visione SQL chiamato AllFavourite. Al fine di caricare i dati nella mia classe DTO Ho il seguente nel mio file hbm.xml ...
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="Domain.Model.Entities" assembly="Domain.Model">
<import class="AllFavourite"/>
</hibernate-mapping>
Nel mio codice ho il seguente.
public IList<AllFavourite> GetFavourites(int userId)
{
var query = Session
.CreateSQLQuery("SELECT * FROM AllFavourite where UserId=:UserId")
.SetInt32("UserId", userId)
.SetResultTransformer(new AliasToBeanResultTransformer(typeof(AllFavourite)));
return query.List<AllFavourite>();
}
Questa grande opera e produce i risultati che io sono dopo, però vorrei spostare lo SQL dal codice in una query di nome nel file hbm.xml. Quindi il mio file hbm.xml ora assomiglia a questo
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="Domain.Model.Entities" assembly="Domain.Model">
<import class="AllFavourite"/>
<query name="GetAllFavouriteByUserId">
<![CDATA[
SELECT * FROM AllFavourite WHERE UserId=:UserId
]]>
</query>
</hibernate-mapping>
e il mio codice ora assomiglia a questo
public IList<AllFavourite> GetFavourites(int userId)
{
var query = Session
.GetNamedQuery("GetAllFavouriteByUserId")
.SetInt32("UserId", userId)
.SetResultTransformer(new AliasToBeanResultTransformer(typeof(AllFavourite)));
return query.List<AllFavourite>();
}
Tuttavia quando ho eseguito questo ottengo un errore: -
Il parametro UserId non esiste come un nome parametro nella [SELECT * FROM AllFavourite DOVE UserId =: UserId]
Quindi la mia domanda è possibile utilizzare una query denominata in questo modo?
Soluzione
Il tag query
si aspetta una query HQL:
<query name="GetAllFavouriteByUserId">
<![CDATA[
from AllFavourite where UserId = :UserId
]]>
</query>
Se si vuole scrivere una query SQL nativo è necessario utilizzare il tag sql-query
:
<sql-query name="GetAllFavouriteByUserId">
<return alias="foo" class="Foo"/>
<![CDATA[
SELECT {foo.ID} as {foo.ID},
{foo}.NAME AS {foo.Name}
FROM sometable
WHERE {foo}.ID = :UserId
]]>
</sql-query>
Altri suggerimenti
Non hai bisogno di questo?
<query-param name='UserId' type='Integer'/>