使用NHibernate调用存储过程

时间:2014-09-22 13:39:09

标签: c# nhibernate stored-procedures nhibernate-mapping

我无法让此存储过程调用工作。我一直得到一个"附加信息:参数UserName不作为[LockUser]"中的命名参数存在。消息

using (var session = sm.OpenSession())         
{
    var query = session.CreateSQLQuery("LockUser")
    .SetString("UserName", User.UserName.ToString());                  
} 

映射

<?xml version="1.0" encoding="utf-8" ?>                                                        <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
namespace="Models.Mappings" assembly="Intranet">
<sql-query name="LockUser">
    <property name="UserName"/>
    exec LockUser :UserName
</sql-query>

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:2)

您正在混合两个功能。

17.2. Named SQL queries

小引用片段:

<sql-query name="persons">
    <return alias="person" class="eg.Person"/>
    SELECT person.NAME AS {person.Name},
           person.AGE AS {person.Age},
           person.SEX AS {person.Sex}
    FROM PERSON person
    WHERE person.NAME LIKE :namePattern
</sql-query>

用法:

IList people = sess.GetNamedQuery("persons")
    .SetString("namePattern", namePattern)
    .SetMaxResults(50)
    .List();

因为我们可以看到必须调用 GetNamedQuery()

或者您可以使用

Chapter 17. Native SQL

小引用片段:

sess.CreateSQLQuery("SELECT ID, NAME, BIRTHDATE, DOG_ID FROM CATS")
    .AddEntity(typeof(Cat));

摘要:对于命名查询,我们必须使用.GetNamedQuery()。我们也可以使用.CreateSQLQuery()自己构建SQL。另请查看此示例:Nhibernate CreateSQLQuery Stored Procedure result to non mapped class