当前位置 : 主页 > 编程语言 > 其它开发 >

NHibernate Issues之1898:命名查询

来源:互联网 收集:自由互联 发布时间:2022-05-25
本节内容 概览 实例 参考资料 概览 这个系列是以博客形式整理关于NHibernate的Issues。记录一些零碎的小例子,通过零零碎碎的整理,可以巩固自己的知识和扩展我们的知识面。这些小例

本节内容

  • 概览
  • 实例
  • 参考资料
概览

这个系列是以博客形式整理关于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

网友评论