代码改变世界

NHibernate Issues之1898:命名查询

2009-10-10 13:20 by 李永京, ... 阅读, ... 评论, 收藏, 编辑

本节内容

概览

这个系列是以博客形式整理关于NHibernate的Issues。记录一些零碎的小例子,通过零零碎碎的整理,可以巩固自己的知识和扩展我们的知识面。这些小例子也可以适当的在项目中呈现。

这次看看ISession.GetNamedQuery()方法。

实例

这个小例子在我们替换更新类中属性值的时候非常有用,直接使用ExecuteUpdate()针对其某个对象更新,效率上也好很多。

1.Domain

public class DomainClass
{
    public virtual int Id { get; set; }
    public virtual string Data { get; set; }
}

2.Mapping

<class name="DomainClass">
    <id name="Id">
        <generator class="assigned" />
    </id>
    <property name="Data" />
</class>
<query name="replaceQuery">
    <query-param name="old" type="String"/>
    <query-param name="new" type="String"/>
    <![CDATA[
   update DomainClass set Data = replace(Data,:old, :new)
    ]]>
</query>

3.Test

//1.保存一个Domain
using (var session = OpenSession())
{
    using (var tx = session.BeginTransaction())
    {
        var entity = new DomainClass { Id = 1, Data = "some oldValue data" };
        session.Save(entity);
        tx.Commit();
    }
}
using (var session = OpenSession())
{
    //使用命名查询更新Domain的Data属性
    using (var tx = session.BeginTransaction())
    {
        session.GetNamedQuery("replaceQuery")
            .SetString("old", "oldValue")
            .SetString("new", "newValue").ExecuteUpdate();
        tx.Commit();
    }
    //验证Domain的Data属性
    using (var tx = session.BeginTransaction())
    {
        var entity = session.Get<DomainClass>(1);
        Assert.AreEqual("some newValue data", entity.Data);
        tx.Commit();
    }
}

4.结果

INSERT INTO DomainClass (Data, Id) VALUES ('some oldValue data', '1');
update DomainClass set Data=replace(Data,'oldValue','newValue');
SELECT domainclas0_.Id as Id0_0_, domainclas0_.Data as Data0_0_ 
FROM DomainClass domainclas0_ WHERE domainclas0_.Id='1';

参考资料

Dario Quintana:Why use named queries with NHibernate