挫莉虻 发表于 2025-5-29 20:01:44

NHibernate拾贝1898:命名查询

本节内容
       
[*]概览       
[*]实例       
[*]参考资料
概览

这个系列是以博客形式整理关于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>
<<b>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></b>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())
    {
      <b>session.GetNamedQuery("replaceQuery")
            .SetString("old", "oldValue")
            .SetString("new", "newValue").ExecuteUpdate();</b>
      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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: NHibernate拾贝1898:命名查询