Использование именованного запроса в hbm с классом импорта

StackOverflow https://stackoverflow.com/questions/1984550

Вопрос

На моем сервере 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 * из AllFavourite, где userId =: userId

Итак, мой вопрос: можно ли использовать именованный запрос таким образом?

Это было полезно?

Решение

А 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'/>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top