Pregunta

En mi servidor MSSQL que tiene una vista de SQL llamada AllFavourite. Con el fin de cargar los datos en mi clase DTO Tengo el siguiente en mi archivo 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>

En mi código que tengo lo siguiente.

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>();
}

Esto funciona muy bien y produce los resultados que yo después, sin embargo me gustaría mover el SQL de código en una consulta con nombre en el archivo hbm.xml. Así que mi archivo hbm.xml ahora se ve así

<?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>

y mi código ahora se ve así

public IList<AllFavourite> GetFavourites(int userId)
{
    var query = Session
        .GetNamedQuery("GetAllFavouriteByUserId")
        .SetInt32("UserId", userId)
        .SetResultTransformer(new AliasToBeanResultTransformer(typeof(AllFavourite)));
    return query.List<AllFavourite>();
}

Sin embargo cuando funciono esto me sale un error: -

  

Parámetro identificación de usuario no existe como una   parámetro denominado en [SELECT *   AllFavourite DONDE UserId =: UserId]

Así que mi pregunta ¿es posible utilizar una consulta con nombre en esta forma?

¿Fue útil?

Solución

La etiqueta query espera una consulta HQL:

<query name="GetAllFavouriteByUserId">
    <![CDATA[
    from AllFavourite where UserId = :UserId
    ]]>
</query>

Si desea escribir una consulta SQL nativo que puedes usar la etiqueta 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>

Otros consejos

¿Usted no necesita esto?

<query-param name='UserId' type='Integer'/>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top