NHibernate Issues之1898:命名查询
2009-10-10 13:20 李永京 阅读(4620) 评论(11) 编辑 收藏 举报本节内容
概览
这个系列是以博客形式整理关于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