Использование именованного запроса в hbm с классом импорта
На моем сервере MSSQL у меня есть представление SQL под названием AllFavourite. Чтобы загрузить данные в мой класс DTO, в моем файле 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>
В моем коде у меня есть следующее.
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>();
}
Это прекрасно работает и дает результаты, которые мне нужны, однако я бы хотел переместить SQL из кода в именованный запрос в файл hbm.xml. Итак, мой файл 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"/>
<query name="GetAllFavouriteByUserId">
<![CDATA[
SELECT * FROM AllFavourite WHERE UserId=:UserId
]]>
</query>
</hibernate-mapping>
и мой код теперь выглядит так
public IList<AllFavourite> GetFavourites(int userId)
{
var query = Session
.GetNamedQuery("GetAllFavouriteByUserId")
.SetInt32("UserId", userId)
.SetResultTransformer(new AliasToBeanResultTransformer(typeof(AllFavourite)));
return query.List<AllFavourite>();
}
Однако, когда я запускаю это, я получаю ошибку:-
Параметр UserId не существует как именованный параметр в [SELECT * FROM AllFavourite WHERE UserId=:UserId]
Итак, мой вопрос, возможно ли использовать именованный запрос таким образом?
2 ответа
query
тег ожидает HQL-запроса:
<query name="GetAllFavouriteByUserId">
<![CDATA[
from AllFavourite where UserId = :UserId
]]>
</query>
Если вы хотите написать собственный SQL-запрос, вы должны использовать 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>
Тебе это не нужно?
<query-param name='UserId' type='Integer'/>