En utilisant une requête nommée dans une HBM avec la classe d'importation
-
22-09-2019 - |
Question
Dans mon serveur MSSQL j'ai vue SQL appelé AllFavourite. Pour charger les données dans ma classe DTO je suit dans mon dossier 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>
Dans mon code, j'ai ce qui suit.
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>();
}
Cela fonctionne très bien et produit les résultats que je suis après, mais je voudrais déplacer le SQL de code dans une requête nommée dans le fichier hbm.xml. Donc, mon fichier hbm.xml ressemble maintenant à ceci
<?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>
et mon code ressemble maintenant à ceci
public IList<AllFavourite> GetFavourites(int userId)
{
var query = Session
.GetNamedQuery("GetAllFavouriteByUserId")
.SetInt32("UserId", userId)
.SetResultTransformer(new AliasToBeanResultTransformer(typeof(AllFavourite)));
return query.List<AllFavourite>();
}
Mais quand je lance ce que je reçois une erreur: -
UserId de paramètre n'existe pas comme paramètre nommé dans [SELECT * FROM AllFavourite OÙ UserId =: UserId]
Alors ma question est-il possible d'utiliser une requête nommée de cette manière?
La solution
La balise query
attend une requête HQL:
<query name="GetAllFavouriteByUserId">
<![CDATA[
from AllFavourite where UserId = :UserId
]]>
</query>
Si vous voulez écrire une requête SQL natif, vous devez utiliser la balise 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>
Autres conseils
Ne vous en avez besoin?
<query-param name='UserId' type='Integer'/>