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?

Était-ce utile?

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'/>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top