2

在我的 MSSQL 服务器中,我有一个名为 AllFavourite 的 SQL 视图。为了将数据加载到我的 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] 中不作为命名参数存在

所以我的问题是可以以这种方式使用命名查询吗?

4

2 回答 2

3

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>
于 2009-12-31T09:35:33.867 回答
0

你不需要这个吗?

<query-param name='UserId' type='Integer'/>
于 2009-12-31T08:58:26.427 回答