找回密码
 立即注册
首页 业界区 业界 NHibernate拾贝1898:命名查询

NHibernate拾贝1898:命名查询

挫莉虻 2025-5-29 20:01:44
本节内容
           
  • 概览       
  • 实例       
  • 参考资料
概览

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

这个小例子在我们替换更新类中属性值的时候非常有用,直接使用ExecuteUpdate()针对其某个对象更新,效率上也好很多。
1.Domain
  1. public class DomainClass
  2. {
  3.     public virtual int Id { get; set; }
  4.     public virtual string Data { get; set; }
  5. }
复制代码
2.Mapping
  1. <class name="DomainClass">
  2.     <id name="Id">
  3.         <generator class="assigned" />
  4.     </id>
  5.     <property name="Data" />
  6. </class>
  7. <<b>query name="replaceQuery">
  8.     <query-param name="old" type="String"/>
  9.     <query-param name="new" type="String"/>
  10.     <![CDATA[
  11.    update DomainClass set Data = replace(Data,:old, :new)
  12.     ]]>
  13. </query></b>
复制代码
3.Test
  1. //1.保存一个Domain
  2. using (var session = OpenSession())
  3. {
  4.     using (var tx = session.BeginTransaction())
  5.     {
  6.         var entity = new DomainClass { Id = 1, Data = "some oldValue data" };
  7.         session.Save(entity);
  8.         tx.Commit();
  9.     }
  10. }
  11. using (var session = OpenSession())
  12. {
  13.     //使用命名查询更新Domain的Data属性
  14.     using (var tx = session.BeginTransaction())
  15.     {
  16.         <b>session.GetNamedQuery("replaceQuery")
  17.             .SetString("old", "oldValue")
  18.             .SetString("new", "newValue").ExecuteUpdate();</b>
  19.         tx.Commit();
  20.     }
  21.     //验证Domain的Data属性
  22.     using (var tx = session.BeginTransaction())
  23.     {
  24.         var entity = session.Get<DomainClass>(1);
  25.         Assert.AreEqual("some newValue data", entity.Data);
  26.         tx.Commit();
  27.     }
  28. }
复制代码
4.结果
  1. INSERT INTO DomainClass (Data, Id) VALUES ('some oldValue data', '1');
  2. update DomainClass set Data=replace(Data,'oldValue','newValue');
  3. SELECT domainclas0_.Id as Id0_0_, domainclas0_.Data as Data0_0_
  4. FROM DomainClass domainclas0_ WHERE domainclas0_.Id='1';
复制代码
参考资料

Dario Quintana:Why use named queries with NHibernate

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册