El uso de una consulta con nombre en una clase de importación con HBM
-
22-09-2019 - |
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?
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'/>