﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-abluedog</title><link>http://www.cnblogs.com/abluedog/</link><description>闲来无胜情，沽酒买一醉；闻歌知雅意，笑看是与非。</description><language>zh-cn</language><lastBuildDate>Mon, 13 Oct 2008 22:43:45 GMT</lastBuildDate><pubDate>Mon, 13 Oct 2008 22:43:45 GMT</pubDate><ttl>60</ttl><item><title>NHibernate Step by Step (五)Criteria Query</title><link>http://www.cnblogs.com/abluedog/archive/2006/04/26/385978.html</link><dc:creator>abluedog</dc:creator><author>abluedog</author><pubDate>Wed, 26 Apr 2006 13:24:00 GMT</pubDate><guid>http://www.cnblogs.com/abluedog/archive/2006/04/26/385978.html</guid><wfw:comment>http://www.cnblogs.com/abluedog/comments/385978.html</wfw:comment><comments>http://www.cnblogs.com/abluedog/archive/2006/04/26/385978.html#Feedback</comments><slash:comments>20</slash:comments><wfw:commentRss>http://www.cnblogs.com/abluedog/comments/commentRss/385978.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/abluedog/services/trackbacks/385978.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>NHibernate Step by Step (</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">五</span><span lang=EN-US>)Criteria Query</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可能很多人象我一样，刚开始接触</span><span lang=EN-US>HQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">时，脑袋一片混沌，这是什么语法嘛！！之所以这样，是因为我们总是会先入为主地将之与</span><span lang=EN-US>SQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">想比，虽然</span><span lang=EN-US>HQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">看起来很</span><span lang=EN-US>SQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，而且设计时就有这样的意图，但是毕竟是两种差别很大的东西，难免就会出现理解偏差的问题。好了，我们今天就不让大家脑袋发晕了，</span><span lang=EN-US>HQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们暂时放一放。今天我们来说另外一种查询方法：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>Criteria Query.</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">什么是</span><span lang=EN-US>Criteria Query?</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">简单说，就是将我们的查询条件封装为一个预定义的查询对象，由这个查询对象来执行查询，而不用我们再去写</span><span lang=EN-US>HQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">了，而且更接近我们贯常的编程习惯。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是不是很不错？让我们来</span><span lang=EN-US>look look</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US></span></p>
<span lang=EN-US><o:p>
<p>&#160;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">创建关联到某个类的查询对象</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">ICriteria&nbsp;criteria&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;session.CreateCriteria(</span><span style="COLOR: #0000ff">typeof</span><span style="COLOR: #000000">(Person));<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">添加表达式</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">criteria.Add(Expression.Eq(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Name</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Jackie&nbsp;Chan</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>IList&nbsp;list&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;criteria.List();<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注意这一句：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">Expression.Eq(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Name</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Jackie&nbsp;Chan</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)</span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></span>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>Eq</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</span><span lang=EN-US>Equal</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的缩写，意思是添加一个查询表达式，</span><span lang=EN-US>Person.Name = &#8220;Jackie Chan&#8221;</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对应</span><span lang=EN-US>HQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就是：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>from Person p where p.Name=&#8221;Jackie Chan&#8221;</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>NHibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会在运行时动态生成类似上面的</span><span lang=EN-US>HQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，我们可以在配置文件把</span><span lang=EN-US>show-sql</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">打开，观看生成的</span><span lang=EN-US>SQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样是不是感觉清晰多了？又回到我们以前的编码习惯了！</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">为了对应</span><span lang=EN-US>HQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的种种查询条件，</span><span lang=EN-US>NHibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">预定义了大量的</span><span lang=EN-US>Expression</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，我们列几个如下：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US></span></p>
<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
<p>&#160;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">Eq&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Equal<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>Gt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Greater&nbsp;than<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>Lt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Less&nbsp;than<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>Like&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Like<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>Not&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Not<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>IsNull&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Is&nbsp;Null</span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><br>基本上对应了大部分</span><span lang=EN-US>HQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的语义，详细的说明请参考</span><span lang=EN-US>api</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面，我们详细介绍</span><span lang=EN-US>Criteria</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的用法。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">1．<span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span lang=EN-US>Example</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">查询</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们常常有这样的查询页面：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">用户可以输入&#8220;姓名&#8221;、&#8220;性别&#8221;、&#8220;年龄&#8221;等等来进行查询，而我们常常的做法就是如下的烦琐：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;condition&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&#8220;&#8221;;<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(txtName.Text&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;condition&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;&#8220;&nbsp;Name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#8221;&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;txtName.Text;<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(txtSex.Text&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;condition&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;&#8220;&nbsp;and&nbsp;Sex</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#8221;&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;txtSex.Text;<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&#8230;&#8230;<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><br>代码看起来实在是不甚美观，有什么解决办法呢？</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>Criteria</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了专为这种问题而设计的</span><span lang=EN-US>Example</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">查询，如下：<br></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><o:p></p>
<br>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">ICriteria&nbsp;criteria&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;session.CreateCriteria(</span><span style="COLOR: #0000ff">typeof</span><span style="COLOR: #000000">(Person));<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>Person&nbsp;person&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Person();<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>person.Name&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Jackie&nbsp;Chan</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>person.Age&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">50</span><span style="COLOR: #000000">;<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">创建一个Example对象</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">criteria.Add(Example.Create(person));<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>IList&nbsp;list&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;criteria.List();</span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt">&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">请注意：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">criteria.Add(Example.Create(person));</span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"></span>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这句代码的意思是通过构造的</span><span lang=EN-US>person</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象的属性来生成表达式，实际生成的代码如下：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">SELECT</span><span style="COLOR: #000000">&nbsp;this.id&nbsp;</span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000">&nbsp;id0_,&nbsp;this.name&nbsp;</span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000">&nbsp;name0_,&nbsp;this.age&nbsp;</span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000">&nbsp;age0_&nbsp;</span><span style="COLOR: #0000ff">FROM</span><span style="COLOR: #000000">&nbsp;Person&nbsp;this&nbsp;</span><span style="COLOR: #0000ff">WHERE</span><span style="COLOR: #000000">&nbsp;(this.age&nbsp;</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">@p0</span><span style="COLOR: #000000">)</span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"></span>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对应上面的问题，我们简单地</span><span lang=EN-US>new</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">出一个</span><span lang=EN-US>person</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象，然后填充其属性即可，不用再去构造那丑陋的条件判断语句了！</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">2．<span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">排序</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们想对返回的</span><span lang=EN-US>list</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行排序，该怎么办呢？如下：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><o:p></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">ICriteria&nbsp;criteria&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;session.CreateCriteria(</span><span style="COLOR: #0000ff">typeof</span><span style="COLOR: #000000">(Person));<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>criteria.Add(Expression.Gt(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Age</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">));&nbsp;<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">添加一个排序对象</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">criteria.AddOrder(Order.Asc(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Age</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>IList&nbsp;list&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;criteria.List();<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt">&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">请注意：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">criteria.AddOrder(Order.Asc(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Age</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));</span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"></span>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这句代码的意思是在</span><span lang=EN-US>criteria</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上构造一个排序对象，并以</span><span lang=EN-US>Age</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">属性做正序排列，</span><span lang=EN-US>NHibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在运行时会生成如下语句：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">SELECT</span><span style="COLOR: #000000">&nbsp;this.id&nbsp;</span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000">&nbsp;id0_,&nbsp;this.name&nbsp;</span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000">&nbsp;name0_,&nbsp;this.age&nbsp;</span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000">&nbsp;age0_&nbsp;</span><span style="COLOR: #0000ff">FROM</span><span style="COLOR: #000000">&nbsp;Person&nbsp;this&nbsp;</span><span style="COLOR: #0000ff">WHERE</span><span style="COLOR: #000000">&nbsp;this.age&nbsp;</span><span style="COLOR: #808080">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #008000">@p0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">ORDER</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">BY</span><span style="COLOR: #000000">&nbsp;this.age&nbsp;</span><span style="COLOR: #0000ff">asc</span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"></span>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如你所猜想，</span><span lang=EN-US>Order</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类肯定有另外一个&#8220;</span><span lang=EN-US>Desc</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8220;方法：）</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">3．<span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">限制记录范围</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在显示大量的记录时，我们常常采用的方法就是分页，如果用</span><span lang=EN-US>NHibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来做，该怎么办呢？</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如下代码：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><o:p></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">ICriteria&nbsp;criteria&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;session.CreateCriteria(</span><span style="COLOR: #0000ff">typeof</span><span style="COLOR: #000000">(Person));<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">从第10条记录开始取</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">criteria.SetFirstResult(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">取20条记录</span><span style="COLOR: #008000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">criteria.SetMaxResults(</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>IList&nbsp;list&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;criteria.List();</span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt">&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样，我们就达到了分页的目的。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注意：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>NHibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的分页机制实际上依赖于不同的数据库实现，所以，对特定的某种数据库，并不一定是效率最好的，比如对</span><span lang=EN-US>SQLServer</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（为什么受伤的总是俺？为什么总是说俺比不上</span><span lang=EN-US>Oracle</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">？俺都赶在</span><span lang=EN-US>2005</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">年年底出</span><span lang=EN-US>2005</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">版本了！！）。想知道为什么吗？很简单，</span><span lang=EN-US>check</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一下上面代码生成的</span><span lang=EN-US>SQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就清楚了！或者深入点再看看</span><span lang=EN-US>NHibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的分页代码，我就不解释了，自己动手，丰衣足食：）</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">总体来讲，</span><span lang=EN-US>Criteria</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对我们来说更熟悉，更容易上手，但是目前</span><span lang=EN-US>Criteria</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还是不够完善——将对应的</span><span lang=EN-US>HQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一一封装实在太烦琐了，所以</span><span lang=EN-US>NHibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还是以</span><span lang=EN-US>HQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">查询为主，我们在使用的时候则看需要了，要么使用</span><span lang=EN-US>HQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，要么</span><span lang=EN-US>HQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang=EN-US>Criteria</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">混合使用，重要的是解决问题，对不？<br></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p><br></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">好了，这一篇就讲这么多，我们下次再接着练习。</span><span lang=EN-US><br></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">任何建议或者批评，请</span><span lang=EN-US>e</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span><span lang=EN-US><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#97;&#98;&#108;&#117;&#101;&#100;&#111;&#103;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;">abluedog@163.com</a></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cnblogs.com/abluedog/aggbug/385978.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42969/" target="_blank">[新闻]MySpace推自助广告平台MyAds</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>PetShop is Evil?</title><link>http://www.cnblogs.com/abluedog/archive/2006/04/22/382391.html</link><dc:creator>abluedog</dc:creator><author>abluedog</author><pubDate>Sat, 22 Apr 2006 13:57:00 GMT</pubDate><guid>http://www.cnblogs.com/abluedog/archive/2006/04/22/382391.html</guid><wfw:comment>http://www.cnblogs.com/abluedog/comments/382391.html</wfw:comment><comments>http://www.cnblogs.com/abluedog/archive/2006/04/22/382391.html#Feedback</comments><slash:comments>24</slash:comments><wfw:commentRss>http://www.cnblogs.com/abluedog/comments/commentRss/382391.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/abluedog/services/trackbacks/382391.html</trackback:ping><description><![CDATA[PetShop is Evil?<br>抱歉使用这么耸人听闻的标题了，但是看到最近博客园上越来越多的petshop分析文章后，我觉得，有些观点实在是有些错位了。<br>PetShop，本来是当年MS在推.Net时，对应Java的PetStore推出的一个演示demo，这个东西本来就是演示性的，或者说很大的用处是对初学者如何快速地对平台框架了解以及基本的企业级开发概念学习——换言之，你并不应该把它当作Best Practice来指导知道开发，因为就一个真正的企业级开发模型来说，它还是不够称职，但是由于.Net开发界的重代码轻架构的风气（你看看多少讨论代码技巧组件设计的文章就知道了），它竟然成了很多.Net程序员进行架构设计的圭臬，实在是太拔高PetShop了！<br><br>在PetShop3的版本时，曾经有位来自Java界的朋友，将之重新实现了一遍，他提到了如下原因：<br>微软的PetShop作为标准企业应用示例中的一个已经推出了很多个版本，目前的3.2版本和以前的版本相比较，平心而论确实有了很大的提高（1.0版本无论是体系结构还是代码编写都足可以作为一个很好的反面示例，呵呵）。但是还是非常的不理想，很多.net程序员居然把它视为以面向对象方式开发的.net 应用的经典。为了纠正目前这种落后的实现方式（意识），做了这次重构，希望可以给大家做一个参考。<br>（找了半天，才在csdn上找到一个url：<a title=http://topic.csdn.net/t/20050204/13/3775366.html href="http://topic.csdn.net/t/20050204/13/3775366.html">http://topic.csdn.net/t/20050204/13/3775366.html</a>）<br><br>当时博客堂的思归曾经有过评论，我把旧文翻出来，给大家参考一下：<br>我的看法是，微软的PetShop 3.*，除了跟Sun的J2EE版本做比较外，主要是提供了一个可做参考的样品，在当前.NET的框架，类库下，怎么手工实现分层应用。这里面涉及很多细节，怎么设计业务层/持久层，怎么做事务，业务层与持久层怎么交互，表现层怎么跟应用层交互，等等，这对初学者来说，是个很好的指导，让人了解在多层应用中，具体都需要做什么。由于O/R的差别，在大型项目中，很多时候大概会用专门的O/R Mapper或持久框架。象NHibernate这样transparent，non-intrusive的技术，指明了很好的方向。但不管用什么，多层应用里所涉及的细节都是需要了解的。在这一点上，对一个.NET开发人员而言，我想，微软的PetShop serves its purpose。<br>我同意，微软的PetShop要真正成为Best Practice的样板，有不少需要提高，完善的地方。譬如他们的Domain Model，用Martin Fowler的说法是有点贫血(Anemic)，但这也许是因为这应用本身没有多少业务逻辑，有人指出过里面不少的缺点，也有人指出过SQL Server / Oracle的实现是否用Bridge模式来实现更恰当些。<br>（原文：<a title=http://blog.joycode.com/saucer/archive/2005/02/05/44160.aspx href="http://blog.joycode.com/saucer/archive/2005/02/05/44160.aspx">http://blog.joycode.com/saucer/archive/2005/02/05/44160.aspx</a>）<br><br>可惜，并没有引起什么反响，就石沉大海了，在java开发界中只起个最基本演示功能的demo，在.net这边竟然被n多的程序员奉为不二法则了！<br><br>Martin Flower在2003年曾经有篇非常著名的文章：Anemic DomainModel（<a title=http://www.martinfowler.com/bliki/AnemicDomainModel.html href="http://www.martinfowler.com/bliki/AnemicDomainModel.html">http://www.martinfowler.com/bliki/AnemicDomainModel.html</a>）<br>他的观点是：象PetShop里面的OrderItem这样的Domain Model类，仅包含属性（getter/setter），而不包含任何领域逻辑，而统统有一个ServiceLayer或者说一个ManagerLayer来进行管理，这实在是一种anti-pattern。（详细的原因大家还是啃啃e文吧）<br>而前些年在Java界Anemic Domain Model的流行，很大程度上是因为EJB2.0的不良设计以及DAO模式的滥觞。<br>关于DAO模式，请参考：<a title=http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html">http://java.sun.com/blueprints/corej2eepatterns/Patterns/DataAccessObject.html</a><br><br><br>企业级架构的设计，本来就是争论比较多，但是经过这几年的争论，目前对Anemic DomainModel已经基本上取得了共识，而现在几种比较流行的<br>层次划分法，大家比较有共识的有如下几种（我从javaeye拿来，由robbin总结的，做些代码性的调整）：<br>1.失血模型<br>失血模型简单来说，就是domain object只有属性的getter/setter方法的纯数据类，所有的业务逻辑完全由business object来完成(又称TransactionScript)，这种模型下的domain object被Martin Fowler称之为&#8220;贫血的domain object&#8221;。<br><br>2.&#8221;贫血模型&#8220;（注意：这个贫血模型在javaeye上讨论n久之后已经与Martin Flower的贫血模型有所差别，他所指的&#8221;贫血&#8220;被称为&#8221;失血&#8220;了。<br>domain object包含了不依赖于持久化的领域逻辑，而那些依赖持久化的领域逻辑被分离到Service层。<br>Service(业务逻辑，事务封装) --&gt; DAO ---&gt; domain object(Item)<br>这也就是Martin Fowler指的rich domain object<br>1．一个带有业务逻辑的实体类，即domain object是Item<br>2．一个DAO接口ItemDao<br>3．一个DAO实现ItemDaoSQLServerImpl（属于DAL层）<br>4．一个业务逻辑对象ItemManager（调用ItemDao）<br>这种模型的优点：<br>1、各层单向依赖，结构清楚，易于实现和维护<br>2、设计简单易行，底层模型非常稳定<br>这种模型的缺点：<br>1、domain object的部分比较紧密依赖的持久化domain logic被分离到Service层，显得不够OO<br>2、Service层过于厚重<br><br><br>3.充血模型<br>充血模型和第二种模型差不多，所不同的就是如何划分业务逻辑，即认为，绝大多业务逻辑都应该被放在domain object里面(包括持久化逻辑)，而Service层应该是很薄的一层，仅仅封装事务和少量逻辑，不和DAO层打交道。<br>Service(事务封装) ---&gt; domain object &lt;---&gt; DAO<br>这种模型就是把第二种模型的domain object和business object合二为一了。所以ItemManager就不需要了，在这种模型下面，只有三个类，他们分别是：<br>Item：包含了实体类信息，也包含了所有的业务逻辑<br>ItemDao：持久化DAO接口类<br>ItemDaoSQLServerImpl：DAO接口的实现类<br><br>在这种模型中，所有的业务逻辑全部都在Item中，事务管理也在Item中实现。<br>这种模型的优点：<br>1、更加符合OO的原则<br>2、Service层很薄，只充当Facade的角色，不和DAO打交道。<br>这种模型的缺点：<br>1、DAO和domain object形成了双向依赖，复杂的双向依赖会导致很多潜在的问题。<br>2、如何划分Service层逻辑和domain层逻辑是非常含混的，在实际项目中，由于设计和开发人员的水平差异，可能导致整个结构的混乱无序。<br>3、考虑到Service层的事务封装特性，Service层必须对所有的domain object的逻辑提供相应的事务封装方法，<br>其结果就是Service完全重定义一遍所有的domain logic，非常烦琐，而且Service的事务化封装其意义就等于把OO的domain logic转换为过程的Service TransactionScript。该充血模型辛辛苦苦在domain层实现的OO在Service层又变成了过程式，对于Web层程序员的角度来看，和贫血模型没有什么区别了。<br><br>4.胀血模型<br>基于充血模型的第三个缺点，有同学提出，干脆取消Service层，只剩下domain object和DAO两层，在domain object的domain logic上面封装事务。<br>domain object(事务封装，业务逻辑) &lt;---&gt; DAO<br>似乎ruby on rails就是这种模型，他甚至把domain object和DAO都合并了。<br>该模型优点：<br>1、简化了分层<br>2、也算符合OO<br>该模型缺点：<br>1、很多不是domain logic的service逻辑也被强行放入domain object ，引起了domain ojbect模型的不稳定<br>2、domain object暴露给web层过多的信息，可能引起意想不到的副作用。<br><br>robbin在后面曾经有个总结，我摘抄如下：<br>简单评价一下：<br>第一种模型绝大多数人都反对，因此反对理由我也不多讲了。但遗憾的是，我观察到的实际情形是，很多使用Hibernate的公司最后都是这种模型，这里面有很大的原因是很多公司的技术水平没有达到这种层次，所以导致了这种贫血模型的出现。从这一点来说，Martin Fowler的批评声音不是太响了，而是太弱了，还需要再继续呐喊。<br>第二种模型就是Martin Fowler一直主张的模型，实际上也是我一直在实际项目中采用这种模型。我没有看过Martin的POEAA，之所以能够自己摸索到这种模型，也是因为从02年我已经开始思考这个问题并且寻求解决方案了，但是当时没有看到Hibernate，那时候做的一个小型项目我已经按照这种模型来做了，但是由于没有O/R Mapping的支持，写到后来又不得不全部改成贫血的domain object，项目做完以后再继续找，随后就发现了Hibernate。当然，现在很多人一开始就是用Hibernate做项目，没有经历过我经历的那个阶段。<br>不过我觉得这种模型仍然不够完美，因为你还是需要一个业务逻辑层来封装所有的domain logic，这显得非常罗嗦，并且业务逻辑对象的接口也不够稳定。如果不考虑业务逻辑对象的重用性的话(业务逻辑对象的可重用性也不可能好)，很多人干脆就去掉了xxxManager这一层，在Web层的Action代码直接调用xxxDao，同时容器事务管理配置到Action这一层上来。Hibernate的caveatemptor就是这样架构的一个典型应用。<br>第三种模型是我很反对的一种模型，这种模型下面，Domain Object和DAO形成了双向依赖关系，无法脱离框架测试，并且业务逻辑层的服务也和持久层对象的状态耦合到了一起，会造成程序的高度的复杂性，很差的灵活性和糟糕的可维护性。也许将来技术进步导致的O/R Mapping管理下的domain object发展到足够的动态持久透明化的话，这种模型才会成为一个理想的选择。就像O/R Mapping的流行使得第二种模型成为了可能.<br><br>javaeye的这篇原文在：<a title=http://forum.javaeye.com/viewtopic.php?t=17579 href="http://forum.javaeye.com/viewtopic.php?t=17579">http://forum.javaeye.com/viewtopic.php?t=17579</a><br>如果你对java以及hibernate比较了解的话，我建议你不妨关注一下。<br><br>我的观点：<br>PetShop就用来学习吧，仅此而已。<br>当然，毕竟架构的设计需要考虑团队的整体水平，在整体水平参差不齐的情况下，而且项目比较小，PetShop的结构也不妨拿来使用，毕竟，我们是做项目，而不是做研究，这是本着实际开发的状况来说的，但是如果是学习并想提高的话，还是——了解并忘记。<br><br>
<img src ="http://www.cnblogs.com/abluedog/aggbug/382391.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42960/" target="_blank">[新闻]Facebook创始人:信息共享或存摩尔定律</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>NHibernate Step by Step (四)Session、Query及HQL</title><link>http://www.cnblogs.com/abluedog/archive/2006/04/17/377635.html</link><dc:creator>abluedog</dc:creator><author>abluedog</author><pubDate>Mon, 17 Apr 2006 14:45:00 GMT</pubDate><guid>http://www.cnblogs.com/abluedog/archive/2006/04/17/377635.html</guid><wfw:comment>http://www.cnblogs.com/abluedog/comments/377635.html</wfw:comment><comments>http://www.cnblogs.com/abluedog/archive/2006/04/17/377635.html#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://www.cnblogs.com/abluedog/comments/commentRss/377635.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/abluedog/services/trackbacks/377635.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">NHibernate Step by Step (四</span><span lang=EN-US>)Session</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US>Query</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">及</span><span lang=EN-US>HQL<br></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><br>我们总结一下在第二篇中的</span><span lang=EN-US>Session</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">操作：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">1．<span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">获取记录</span><span lang=EN-US></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">Person&nbsp;person&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(Person)session.Get(</span><span style="COLOR: #0000ff">typeof</span><span style="COLOR: #000000">(Person),</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);</span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"></span>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">2．<span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">保存记录</span><span lang=EN-US></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">session.Save(person);</span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"></span>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 18.0pt"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">3．<span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">删除记录</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">Person&nbsp;person&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(Person)session.Get(</span><span style="COLOR: #0000ff">typeof</span><span style="COLOR: #000000">(Person),</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>session.Delet(person);<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们再来看看其它几种方式：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">1．<span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span lang=EN-US>Load</span><span lang=EN-US></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">Person&nbsp;person&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(Person)session.Load(</span><span style="COLOR: #0000ff">typeof</span><span style="COLOR: #000000">(Person),</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);</span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"></span>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是不是感觉和</span><span lang=EN-US>Get</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一样？其实&#8230;&#8230;很不一样！</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US>Get</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在找不到对象时会返回一个</span><span lang=EN-US>null</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">引用，而</span><span lang=EN-US>Load</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则会抛出一个</span><span lang=EN-US>ObjectNotFoundException</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，所以，不应该用</span><span lang=EN-US>Load</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来判断记录是否存在。另外还有两条非常重要的区别，我们将放在高级话题讨论。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo2; tab-stops: list 18.0pt"><span lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><span style="mso-list: Ignore">2．<span style="FONT: 7pt 'Times New Roman'">&nbsp; </span></span></span><span lang=EN-US>Query</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt"><span lang=EN-US><o:p></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">IList&nbsp;list&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;session.CreateQuery(&#8220;from&nbsp;Person&#8221;).List();<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>Person&nbsp;person&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(Person)list[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">];</span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 18pt">&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>~!#@^?? from Person??#$@*&amp;^$</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这是虾米？？</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">好象有点象</span><span lang=EN-US>SQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，不过少了个</span><span lang=EN-US>select</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">啊！而且也没有表名啊！</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这就是久负盛名的</span><span lang=EN-US>HQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">——</span><span lang=EN-US>Hibernate Query Language!</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>HQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实际上是基于对象查询的一种仿</span><span lang=EN-US>SQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">脚本，在运行期间，</span><span lang=EN-US>Hibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">会自动根据映</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">射关系将之转换为真正的</span><span lang=EN-US>SQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">语句来执行。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">什么？又一种</span><span lang=EN-US>SQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">？不是说使用</span><span lang=EN-US>O/R Mapping</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就可以不写</span><span lang=EN-US>SQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">了吗，怎么又多了一种</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8220;</span><span lang=EN-US>SQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8221;？？</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当然不是这样了，之所以产生</span><span lang=EN-US>HQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，就是为了能够更加灵活更加面向对象地操作数据</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，而且你不应该把</span><span lang=EN-US>HQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当成一种新的</span><span lang=EN-US>SQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，因<br>&nbsp;&nbsp;&nbsp; 为它——太简单好学了！</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">看看下面的</span><span lang=EN-US>HQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，是不是很熟悉？？</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000">&nbsp;p.Name&nbsp;</span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;Person&nbsp;</span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000">&nbsp;p&nbsp;</span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000">&nbsp;p.Id</span><span style="COLOR: #808080">=</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000">&nbsp;Name&nbsp;</span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;Person&nbsp;</span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000">&nbsp;Age</span><span style="COLOR: #808080">&gt;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">20</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000">&nbsp;Id,Name&nbsp;</span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;Person&nbsp;</span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000">&nbsp;Id</span><span style="COLOR: #808080">&gt;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">1</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">and</span><span style="COLOR: #000000">&nbsp;Age</span><span style="COLOR: #808080">&gt;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">20</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><br></span></span><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">认出来老兄弟了吧！！</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（从这里开始，我们给</span><span lang=EN-US>person</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表添加了一个</span><span lang=EN-US>age</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">列，请注意）</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>ok</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，我们这里就详细解释。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>&#8220;from Person &#8221;</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">意思是取出</span><span lang=EN-US>Person</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类映射的</span><span lang=EN-US>person</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表中的所有记录，对应的</span><span lang=EN-US>SQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8220;</span><span lang=EN-US>Select * from person&#8221;</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还可以加上别名：</span><span lang=EN-US>from Person (as) p<span style="mso-tab-count: 1"> </span>= Select * from person (as) p</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这样一解释就很清楚了吧！一句话，你便已经掌握了</span><span lang=EN-US>HQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US>50%</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">！</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">而&#8220;</span><span lang=EN-US>select Name from Person&#8221;</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，当然也就是只取</span><span lang=EN-US>person</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表的</span><span lang=EN-US>name</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">列了！</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你所知道的</span><span lang=EN-US>where</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中的</span><span lang=EN-US>and</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US>or</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US>is</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US>like</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US>between</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US>&gt;</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US>&lt;</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span><span lang=EN-US>=</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">等等都可以直接拿来使用，</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如下：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000">&nbsp;p.Name&nbsp;</span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;Person&nbsp;p&nbsp;</span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000">&nbsp;p.Age</span><span style="COLOR: #808080">&gt;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">20</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;Person&nbsp;p&nbsp;</span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000">&nbsp;p.Age&nbsp;</span><span style="COLOR: #808080">between</span><span style="COLOR: #000000">&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">20</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #808080">and</span><span style="COLOR: #000000">&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #800000">30</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;person&nbsp;p&nbsp;</span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000">&nbsp;p.Age&nbsp;</span><span style="COLOR: #808080">in</span><span style="COLOR: #000000">&nbsp;(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">20</span><span style="COLOR: #000000">,</span><span style="FONT-WEIGHT: bold; COLOR: #800000">30</span><span style="COLOR: #000000">)<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;person&nbsp;p&nbsp;</span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000">&nbsp;p.Name&nbsp;</span><span style="COLOR: #0000ff">is</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000">&nbsp;person&nbsp;p&nbsp;</span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000">&nbsp;p.Name&nbsp;</span><span style="COLOR: #808080">like</span><span style="COLOR: #000000">&nbsp;&#8220;Jaki</span><span style="COLOR: #808080">%</span><span style="COLOR: #000000">&#8221;</span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></span></span><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注意：字段大小写应该尽量跟属性名称保持一致，尤其是在使用别名的情况下，如：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>p.age</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">将会导致一个&#8220;无法解析属性</span><span lang=EN-US>age</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8220;的错误。但是在不使用别名的情况下我的机器</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上&#8221;</span><span lang=EN-US>age</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8220;和</span><span lang=EN-US>&#8217;Age</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8220;一样可以通过，虽然如此，<br>&nbsp;&nbsp;&nbsp; 建议还是跟类文件保持一致。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行</span><span lang=EN-US>HQL</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是通过</span><span lang=EN-US>IQuery</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来实现的，如下是详细的写法：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"></p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">IQuery&nbsp;query&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;session.CreateQuery(&#8220;from&nbsp;Person&#8221;);<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>IList&nbsp;list&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;query.List();</span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><br>&nbsp;&nbsp;&nbsp;通过</span><span lang=EN-US>session</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来创建一个</span><span lang=EN-US>query</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，然后执行</span><span lang=EN-US>query</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US>List</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，返回符合条件的</span><span lang=EN-US>IList</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如上面的&#8220;</span><span lang=EN-US>from Person</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8220;，将返回</span><span lang=EN-US>person</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表的所有记录，</span><span lang=EN-US>list</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中将包含映射到</span><span lang=EN-US>Person</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的对应表中所有记录的对象。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">好了，这一篇就讲这么多，我们下次再接着练习。</span><span lang=EN-US><br></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">任何建议或者批评，请</span><span lang=EN-US>e</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span><span lang=EN-US><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#97;&#98;&#108;&#117;&#101;&#100;&#111;&#103;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;">abluedog@163.com</a></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<img src ="http://www.cnblogs.com/abluedog/aggbug/377635.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42959/" target="_blank">[新闻]微软承认Vista用户账户控制功能有问题</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>NHibernate Step by Step (三) Configuration和Sessionfactory</title><link>http://www.cnblogs.com/abluedog/archive/2006/04/17/377630.html</link><dc:creator>abluedog</dc:creator><author>abluedog</author><pubDate>Mon, 17 Apr 2006 14:38:00 GMT</pubDate><guid>http://www.cnblogs.com/abluedog/archive/2006/04/17/377630.html</guid><wfw:comment>http://www.cnblogs.com/abluedog/comments/377630.html</wfw:comment><comments>http://www.cnblogs.com/abluedog/archive/2006/04/17/377630.html#Feedback</comments><slash:comments>15</slash:comments><wfw:commentRss>http://www.cnblogs.com/abluedog/comments/commentRss/377630.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/abluedog/services/trackbacks/377630.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>NHibernate Step by Step (</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">三</span><span lang=EN-US>)&nbsp;Configuration</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang=EN-US>Sessionfactory</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">好了，我们再从头看一看</span><span lang=EN-US>Configuration</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，是否只能从</span><span lang=EN-US>App.config</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中取配置信息？？</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当然不是了，以下是</span><span lang=EN-US>3</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">种最常见的配置：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>&lt;1&gt;<span style="mso-tab-count: 1"> </span>Configuration config = new Configuration();</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这种配置方法将会到应用程序配置文件（</span><span lang=EN-US>App.Config,Web.Config</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）中查找</span><span lang=EN-US>NHibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的配置信息，</span><span lang=EN-US>NHibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的配置节必须符合应用程序配置文件个格式，前面的教程我们已经看到过了。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>&lt;2&gt;<span style="mso-tab-count: 1"> </span>Configuration config = new Configuration().Configure();</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这种配置方法将会在应用的相同目录查找名为</span><span lang=EN-US>&#8221;hibernate.cfg.xml&#8221;</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的标准</span><span lang=EN-US>Hibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">配置</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件，格式如下：<br></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">&lt;?</span><span style="COLOR: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"&nbsp;</span><span style="COLOR: #0000ff">?&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">hibernate-configuration&nbsp;&nbsp;</span><span style="COLOR: #ff0000">xmlns</span><span style="COLOR: #0000ff">="urn:nhibernate-configuration-2.0"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">session-factory&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="MySessionFactory"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;properties&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="connection.provider"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">NHibernate.Connection.DriverConnectionProvider</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="connection.driver_class"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">NHibernate.Driver.SqlClientDriver</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="connection.connection_string"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Server=localhost;initial&nbsp;catalog=Hibernate;Integrated&nbsp;Security=SSPI</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="show_sql"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">false</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="dialect"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">NHibernate.Dialect.MsSql2000Dialect</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="use_outer_join"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">true</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">property&nbsp;</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="query.substitutions"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">true&nbsp;1,&nbsp;false&nbsp;0,&nbsp;yes&nbsp;'Y',&nbsp;no&nbsp;'N'</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">&lt;!--</span><span style="COLOR: #008000">&nbsp;mapping&nbsp;files&nbsp;</span><span style="COLOR: #008000">--&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">mapping&nbsp;</span><span style="COLOR: #ff0000">assembly</span><span style="COLOR: #0000ff">="Test.Model"</span><span style="COLOR: #ff0000">&nbsp;</span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">session-factory</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">hibernate-configuration</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang=EN-US>&lt;3&gt;<span style="mso-tab-count: 1"> </span>Configuration config = new Configuration().Configure(configFileName);</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这种配置方法将查找指定的</span><span lang=EN-US>Hibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">标准配置文件，可以是绝对路径或者相对路径。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">另外我们还可以通过编码的方式添加配置信息：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">Hashtable&nbsp;props&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Hashtable();<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>props[&#8220;dialect&#8221;]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;xxxx;<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&#8230;<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>config.Properties&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;props;</span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><br></span></span><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这种方式不够配置文件来的灵活，所以我们一般不建议使用。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在取得</span><span lang=EN-US>config</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后，我们还需要进行映射文件添加，同样，我们常用以下</span><span lang=EN-US>3</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">种不同的方法：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>&lt;1&gt;<span style="mso-tab-count: 1"> </span>config.AddXmlFile(&#8220;Person.hbm.xml&#8221;);</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>&lt;2&gt;<span style="mso-tab-count: 1"> </span>config.AddClass(typeof(Test.Model.Person));</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>&lt;3&gt;<span style="mso-tab-count: 1"> </span>config.AddAssembly(&#8220;Test.Model&#8221;);</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">以上方法都可以用&#8220;阶梯式&#8220;的编码风格，如下：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><span style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">config.AddXmlFile(&#8220;Person.hbm.xml&#8221;)<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.AddXmlFile(&#8220;User.hbm.xml&#8221;)<br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.AddClass(</span><span style="COLOR: #0000ff">typeof</span><span style="COLOR: #000000">(Test.Model.Customer));</span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></span></span><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">当然，为了方便起见，我们一般把所有的影射类文件及</span><span lang=EN-US>xml</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">文件统一放在一个程序集中，然后使用</span><span lang=EN-US>config.AddAssembly(assemblyName)</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的方式，让</span><span lang=EN-US>NHibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">自动去查找指定程序集中所有的映射文件和映射类。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你有没有发现在我们使用标准的</span><span lang=EN-US>hibernate</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">配置文件时，有如下一个元素：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>&lt;!-- mapping files --&gt;</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>&lt;mapping assembly="Test.Model" /&gt;</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对了，你想的不错，我们可以避免在代码中捆绑映射程序集，而在配置文件中指定，这种方式可以说是最灵活的了。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提示：在</span><span lang=EN-US>Web</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序中，最好将配置文件改为</span><span lang=EN-US>config</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的后缀，否则在没有添加对</span><span lang=EN-US>xml</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US>asp.net</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">映射的情况下，你的配置文件就有可能被下载哟！！</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们再来看看</span><span lang=EN-US>Sessionfactory</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">ISessionFactory&nbsp;sessionFactory&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;config.BuildSessionFactory();</span></div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"></span>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在由</span><span lang=EN-US>Configuration</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">构造完</span><span lang=EN-US>SessionFactory</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">后，</span><span lang=EN-US>SessionFactory</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">便保留了配置信息而不再需要</span><span lang=EN-US>Configuration</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，之后</span><span lang=EN-US>Configurationd</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的任何变化都不会影响到已经创建好的</span><span lang=EN-US>SessionFactory</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，如果你的配置信息发生变化，那么，毋庸置疑，你必须重新由</span><span lang=EN-US>Configuration</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">构造出一个新的</span><span lang=EN-US>SessionFactory</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注意：</span><span lang=EN-US>SessionFactory</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一个</span><span lang=EN-US>Heavy Object</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，它不但保存了配置信息，而且还有所有的映射关系（你可以调用</span><span lang=EN-US>GetAllCollectionMetadata</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法试验一下），以及需要进行总体维护的缓存等等信息，所以，我们不应该重复地创建</span><span lang=EN-US>SessionFactory</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象，而应该充分共用已经创建出来的</span><span lang=EN-US>SessionFactory</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对象，同时，</span><span lang=EN-US>SessionFactory</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也是一个线程安全的对象，所以在多线程的场景下也完全可以共用。在我们实际开发中，我们可以在初始化的部分构造一个</span><span lang=EN-US>SessionFactory</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">即可，比如，在一个公共静态类中初始化一个</span><span lang=EN-US>SessionFactory</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的</span><span lang=EN-US>readonly</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">常量等等。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">另外需要注意的是，如果你要对多个数据库进行操作，那么你可以配置针对每个数据库而创建对应的</span><span lang=EN-US>SessionFactory</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">——大部分情况下，一个数据库对应一个</span><span lang=EN-US>SessionFactory</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">足够使用。</span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><o:p>&nbsp;</o:p></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">好了，这一篇就讲这么多，我们下次再接着练习。</span><span lang=EN-US><br></span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">任何建议或者批评，请</span><span lang=EN-US>e</span><span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">：</span><span lang=EN-US><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#97;&#98;&#108;&#117;&#101;&#100;&#111;&#103;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;">abluedog@163.com</a></span></p>
<img src ="http://www.cnblogs.com/abluedog/aggbug/377630.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42959/" target="_blank">[新闻]微软承认Vista用户账户控制功能有问题</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>NHibernate Step by Step(二) 单表操作</title><link>http://www.cnblogs.com/abluedog/archive/2006/04/15/375940.html</link><dc:creator>abluedog</dc:creator><author>abluedog</author><pubDate>Sat, 15 Apr 2006 06:32:00 GMT</pubDate><guid>http://www.cnblogs.com/abluedog/archive/2006/04/15/375940.html</guid><wfw:comment>http://www.cnblogs.com/abluedog/comments/375940.html</wfw:comment><comments>http://www.cnblogs.com/abluedog/archive/2006/04/15/375940.html#Feedback</comments><slash:comments>22</slash:comments><wfw:commentRss>http://www.cnblogs.com/abluedog/comments/commentRss/375940.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/abluedog/services/trackbacks/375940.html</trackback:ping><description><![CDATA[摘要: NHibernate Step by Step(二) 单表操作接着第一期，我们继续。为了方便学习测试，从今天开始我将使用MS Test来进行测试，这样就避免了在一个Console工程里不停地添加、注释代码了。提示：为了在VS2005IDE中获得NHibernate配置文件的代码提示，请将你的$NHibernate\src\NHibernate下的nhibernate-configuration-2&nbsp;&nbsp;<a href='http://www.cnblogs.com/abluedog/archive/2006/04/15/375940.html'>阅读全文</a><img src ="http://www.cnblogs.com/abluedog/aggbug/375940.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42958/" target="_blank">[新闻]资本寒冬侵袭中国视频网站 营销春天或不远</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>NHibernate Step by Step (一) Hello,NHibernate!</title><link>http://www.cnblogs.com/abluedog/archive/2006/04/15/375862.html</link><dc:creator>abluedog</dc:creator><author>abluedog</author><pubDate>Sat, 15 Apr 2006 04:47:00 GMT</pubDate><guid>http://www.cnblogs.com/abluedog/archive/2006/04/15/375862.html</guid><wfw:comment>http://www.cnblogs.com/abluedog/comments/375862.html</wfw:comment><comments>http://www.cnblogs.com/abluedog/archive/2006/04/15/375862.html#Feedback</comments><slash:comments>163</slash:comments><wfw:commentRss>http://www.cnblogs.com/abluedog/comments/commentRss/375862.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/abluedog/services/trackbacks/375862.html</trackback:ping><description><![CDATA[摘要: NHibernate Step by Step (一) Hello,NHibernate!好了，今天我们正式开始NHibernate的历程，在第一次的练习中，我将尽量详细地讲解环境的配置，以后将不再详细解释。基本的软件环境如下：1．NHibernatewww.nhibernate.org当前版本是1.0.22．Code Smithhttp://www.codesmithtools.com/3．NH&nbsp;&nbsp;<a href='http://www.cnblogs.com/abluedog/archive/2006/04/15/375862.html'>阅读全文</a><img src ="http://www.cnblogs.com/abluedog/aggbug/375862.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42958/" target="_blank">[新闻]资本寒冬侵袭中国视频网站 营销春天或不远</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>NHibernate Step by Step：序篇</title><link>http://www.cnblogs.com/abluedog/archive/2006/04/15/375676.html</link><dc:creator>abluedog</dc:creator><author>abluedog</author><pubDate>Fri, 14 Apr 2006 17:09:00 GMT</pubDate><guid>http://www.cnblogs.com/abluedog/archive/2006/04/15/375676.html</guid><wfw:comment>http://www.cnblogs.com/abluedog/comments/375676.html</wfw:comment><comments>http://www.cnblogs.com/abluedog/archive/2006/04/15/375676.html#Feedback</comments><slash:comments>39</slash:comments><wfw:commentRss>http://www.cnblogs.com/abluedog/comments/commentRss/375676.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/abluedog/services/trackbacks/375676.html</trackback:ping><description><![CDATA[<p>很久以前，你可能习惯了connection.open，command.execute（"select...")这样的代码,写啊写啊，你开始不停地copy/paste，因为数据库的操作太雷同了，还好，粘粘贴贴倒也凑合，然后有一天客户说他们要用oracle，于是你开始抱着本oracle开发指南狂啃pl/sql，你开始试验调用oracle的存储过程该怎么写，参数是用@还是？或者是：，取个blob游标又要咋写，你纳闷为啥这不同的数据库sql区别咋这么大呢？不都是号称符合啥sql几几的标准吗？你的头开始痛了，你开始写不同的DAL，代码与十指齐飞，脑袋昏昏天黑黑——又加班了！！这次第，怎一个愁字了得！！<br>然后你觉得再也不能这样过了，再也不能这样活了，你开始用DAAB，后来升级到Enterprise Library，恩，不错，代码好象少了，后来再加个Code Smith，恩，不错，自动生成代码，自己敲键盘少了，虽然你还得在不同的数据库间挣扎，还得把取出来的数据一点一点地填到你的实体类里，但是目前看上去还不赖，可以忙里偷闲泡杯两块八一包的劣质茶叶咂吧咂吧你那被劣质显示器辐射的开裂的嘴唇了。但是你觉得还不够，你在想，是否有Code Neo，或者干脆来个Code Matrix，整个DAL都不用自己写了，自动把数据库的数据填到自己的实体类里，然后对这个对象进行操作就行了，剩下的CRUD全部有这个Code Matrix来完成，达不达？？<br>神啊，救救我吧&#8230;&#8230;</p>
<p>&#8220;当当当当&#8230;&#8230;&#8220;，O/R Mapping来到了大家的眼前。<br>O/R Mapping全称是object/rational mapping,即对象/关系数据库映射，意思是对象模型和关系模型的映射，也就是把我们常见的以对象模型表示的对象映射到关系模型上去，当然，这个关系模型我们常常指的是目前大部分主流的关系数据库，如oracle/sqlserver等等。基于.Net来说，o/r mapping就是将我们的.Net类映射到数据库中指定的表上，由O/R Mapping框架帮我们实现object&lt;--&gt;table之间的交互，我们完全不再需要写sql语句（当然不是绝对的），也不再关心背后用的是那种数据库，你只需要定义好对象和数据库该如何交互，剩下的，全部由O/R Mapping的框架来解决，你只需要如下代码即可：<br>Customer cust = framework.Get(...);<br>cust.Name = "newname";<br>framework.Save(cust);<br>或者:<br>framework.Delete(cust);<br>ok！！手起键盘落，整个世界清净了！！</p>
<p>是不是很动心啊？？<br>ok，正式介绍今天的主角——Hibernate！！<br>Hibernate是一个目前应用的最广泛的开放源代码的对象关系映射框架，它对Java的JDBC（类似于ADO.Net）进行了非常轻量级的对象封装，使得程序员可以随心所欲的使用对象编程思维来操纵数据库，目前在国内Java开发界已经颇为流行，Hibernate+Spring往往是很多Java公司招聘的要求。而NHibernate，顾名思义，如同NUnit，NAnt一样，是基于.Net的Hibernate实现，但是目前介绍NHibernate的资料非常少，缺少一个系统完整的教程来全面的展现和深入NHibernate，而且现在NHibernate的文档又残缺不全，少的可怜，很多NHibernate的学习者往往都是通过Hibernate的文档来学习，但是毕竟不是所有的.Net开发者都熟悉Java，也不是所有的人都有精力有时间去学习Java，所以，我准备开始一个Step by Step的NHibernate教程，以便有兴趣的朋友能够快速的熟悉NHibernate，能够更快地体验NHibernate的开发乐趣。<br>我将会从零开始，配以详细的代码和图片，以便感兴趣的朋友能够最快最清晰地掌握NHibernate，任何建议，请e至：<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#97;&#98;&#108;&#117;&#101;&#100;&#111;&#103;&#64;&#49;&#54;&#51;&#46;&#99;&#111;&#109;">abluedog@163.com</a></p>
<img src ="http://www.cnblogs.com/abluedog/aggbug/375676.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42958/" target="_blank">[新闻]资本寒冬侵袭中国视频网站 营销春天或不远</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item></channel></rss>