Usando uma consulta nomeada em um HBM com a classe de importação
-
22-09-2019 - |
Pergunta
No meu servidor MSSQL, tenho uma exibição SQL chamada AllFavourite. Para carregar os dados na minha classe DTO, tenho o seguinte no meu arquivo 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>
No meu código, tenho o seguinte.
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>();
}
Isso funciona muito bem e produz os resultados que eu tenho, no entanto, gostaria de mover o SQL do código para uma consulta nomeada para o arquivo hbm.xml. Então, meu arquivo hbm.xml agora se parece com isso
<?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 meu código agora se parece com isso
public IList<AllFavourite> GetFavourites(int userId)
{
var query = Session
.GetNamedQuery("GetAllFavouriteByUserId")
.SetInt32("UserId", userId)
.SetResultTransformer(new AliasToBeanResultTransformer(typeof(AllFavourite)));
return query.List<AllFavourite>();
}
No entanto, quando eu corro isso, recebo um erro:-
O parâmetro UserID não existe como um parâmetro nomeado em [selecione * de AllFavourite WHERE UserID =: UserID
Então, minha pergunta é possível usar uma consulta nomeada dessa maneira?
Solução
o query
TAG espera uma consulta HQL:
<query name="GetAllFavouriteByUserId">
<![CDATA[
from AllFavourite where UserId = :UserId
]]>
</query>
Se você quiser escrever uma consulta SQL nativa, você deve usar o sql-query
marcação:
<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>
Outras dicas
Você não precisa disso?
<query-param name='UserId' type='Integer'/>