﻿<?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>BlogJava-Hibernate进行时-文章分类-Hibernate</title><link>http://www.blogjava.net/caixuetao/category/3790.html</link><description>有关Hibenrate及其相关工具的主页</description><language>zh-cn</language><lastBuildDate>Tue, 07 Aug 2007 01:03:23 GMT</lastBuildDate><pubDate>Tue, 07 Aug 2007 01:03:23 GMT</pubDate><ttl>60</ttl><item><title>Hibernate3.2对sqlserver2005查询分页的处理</title><link>http://www.blogjava.net/caixuetao/articles/134704.html</link><dc:creator>caixuetao</dc:creator><author>caixuetao</author><pubDate>Mon, 06 Aug 2007 07:15:00 GMT</pubDate><guid>http://www.blogjava.net/caixuetao/articles/134704.html</guid><wfw:comment>http://www.blogjava.net/caixuetao/comments/134704.html</wfw:comment><comments>http://www.blogjava.net/caixuetao/articles/134704.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caixuetao/comments/commentRss/134704.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caixuetao/services/trackbacks/134704.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对Hibernate的查询分页，想必大家都比较熟悉了。setFirstResult()和setMaxResults()就可以搞定。但是使用sqlserver的朋友发现了吗，hibernate发送的分页语句中总是会有令人心烦的"select top 数字" 这样的字符串。比如你一页显示50条记录，现在要查询第100页的数据，则会出现"select top 50000"这样的语句，它是先把前5000条数据抓出到内存中，处理后仅返回最后的50条给你，但是其他的4500条不是多余的了吗？想想还真是憋火。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 网上广为流传的一篇文章《实现Hibernate分页查询原理解读》(作者robbin)中已经讲的很清楚了，如果数据库自身支持分页查询，那么这种数据库的Dialect中的supportsLimit()方法将返回true,而Hibernate则才会去调用getLimitString()方法以得到分页的语句，比如对mysql来说是<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.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">pagingSelect.append(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;limit&nbsp;?,&nbsp;?</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span></div>
而对于oracle是：<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.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">pagingSelect.append(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">select&nbsp;*&nbsp;from&nbsp;(&nbsp;select&nbsp;row_.*,&nbsp;rownum&nbsp;rownum_&nbsp;from&nbsp;(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span></div>
当然，sqlserver也不甘落后，好像非得supportsLimit它才舒服。它的supportsLimit()也是true,同时它的getLimitString()方法为:<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 id=Codehighlighter1_72_337_Open_Image onclick="this.style.display='none'; Codehighlighter1_72_337_Open_Text.style.display='none'; Codehighlighter1_72_337_Closed_Image.style.display='inline'; Codehighlighter1_72_337_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_72_337_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_72_337_Closed_Text.style.display='none'; Codehighlighter1_72_337_Open_Image.style.display='inline'; Codehighlighter1_72_337_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;String&nbsp;getLimitString(String&nbsp;querySelect,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;offset,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;limit)&nbsp;</span><span id=Codehighlighter1_72_337_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_72_337_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_94_172_Open_Image onclick="this.style.display='none'; Codehighlighter1_94_172_Open_Text.style.display='none'; Codehighlighter1_94_172_Closed_Image.style.display='inline'; Codehighlighter1_94_172_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_94_172_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_94_172_Closed_Text.style.display='none'; Codehighlighter1_94_172_Open_Image.style.display='inline'; Codehighlighter1_94_172_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;offset&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;)&nbsp;</span><span id=Codehighlighter1_94_172_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_94_172_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;UnsupportedOperationException(&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sql&nbsp;server&nbsp;has&nbsp;no&nbsp;offset</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;StringBuffer(&nbsp;querySelect.length()</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">&nbsp;)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(querySelect)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.insert(&nbsp;getAfterSelectInsertPoint(querySelect),&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;top&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;limit&nbsp;)<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.toString();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
看到那个&#8220;top&#8221;的来历了吧。<br>而实事上，select top进行分页查询的效率非常之低，远不如下面的语句:<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.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">rs.absolute(firstRow);</span></div>
从《实现Hibernate分页查询原理解读》中可以知道，rs.absolute(firstRow);执行的条件是数据库Dialect不支持分页查询，这句话有点绕，其实它的真正意思是&#8220;supportsLimit()方法返回的是false&#8221;。当supportsLimit()返回false时，Hibernate采用rs.absolute(firstRow);来进行分页查询。说到这里，大家心知肚明了吧。其实解决起来比较简单，你自己定义一个MySqlServer2005Dialect，继承于原来的org.hibernate.dialect.SQLServerDialect，覆盖其supportsLimit()方法，如下:<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 id=Codehighlighter1_31_50_Open_Image onclick="this.style.display='none'; Codehighlighter1_31_50_Open_Text.style.display='none'; Codehighlighter1_31_50_Closed_Image.style.display='inline'; Codehighlighter1_31_50_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_31_50_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_31_50_Closed_Text.style.display='none'; Codehighlighter1_31_50_Open_Image.style.display='inline'; Codehighlighter1_31_50_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000">&nbsp;supportsLimit()&nbsp;</span><span id=Codehighlighter1_31_50_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_31_50_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
然后在hibernate配置文件中使用你自己的MySqlServer2005Dialect方言即可。<br>同时要注意的是，在Loader类的1471行有一个方法，它是：<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 id=Codehighlighter1_0_82_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_82_Open_Text.style.display='none'; Codehighlighter1_0_82_Closed_Image.style.display='inline'; Codehighlighter1_0_82_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_0_82_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_82_Closed_Text.style.display='none'; Codehighlighter1_0_82_Open_Image.style.display='inline'; Codehighlighter1_0_82_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top><span id=Codehighlighter1_0_82_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**&nbsp;*/</span><span id=Codehighlighter1_0_82_Open_Text><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Advance&nbsp;the&nbsp;cursor&nbsp;to&nbsp;the&nbsp;first&nbsp;required&nbsp;row&nbsp;of&nbsp;the&nbsp;&lt;tt&gt;ResultSet&lt;/tt&gt;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;advance(</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000">&nbsp;ResultSet&nbsp;rs,&nbsp;</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000">&nbsp;RowSelection&nbsp;selection)<br><img id=Codehighlighter1_179_550_Open_Image onclick="this.style.display='none'; Codehighlighter1_179_550_Open_Text.style.display='none'; Codehighlighter1_179_550_Closed_Image.style.display='inline'; Codehighlighter1_179_550_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_179_550_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_179_550_Closed_Text.style.display='none'; Codehighlighter1_179_550_Open_Image.style.display='inline'; Codehighlighter1_179_550_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000">&nbsp;SQLException&nbsp;</span><span id=Codehighlighter1_179_550_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_179_550_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;firstRow&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;getFirstRow(&nbsp;selection&nbsp;);<br><img id=Codehighlighter1_254_547_Open_Image onclick="this.style.display='none'; Codehighlighter1_254_547_Open_Text.style.display='none'; Codehighlighter1_254_547_Closed_Image.style.display='inline'; Codehighlighter1_254_547_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_254_547_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_254_547_Closed_Text.style.display='none'; Codehighlighter1_254_547_Open_Image.style.display='inline'; Codehighlighter1_254_547_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;firstRow&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;)&nbsp;</span><span id=Codehighlighter1_254_547_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_254_547_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_325_411_Open_Image onclick="this.style.display='none'; Codehighlighter1_325_411_Open_Text.style.display='none'; Codehighlighter1_325_411_Closed_Image.style.display='inline'; Codehighlighter1_325_411_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_325_411_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_325_411_Closed_Text.style.display='none'; Codehighlighter1_325_411_Open_Image.style.display='inline'; Codehighlighter1_325_411_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;getFactory().getSettings().isScrollableResultSetsEnabled()&nbsp;)&nbsp;</span><span id=Codehighlighter1_325_411_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_325_411_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;we&nbsp;can&nbsp;go&nbsp;straight&nbsp;to&nbsp;the&nbsp;first&nbsp;required&nbsp;row</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rs.absolute(&nbsp;firstRow&nbsp;);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img id=Codehighlighter1_421_543_Open_Image onclick="this.style.display='none'; Codehighlighter1_421_543_Open_Text.style.display='none'; Codehighlighter1_421_543_Closed_Image.style.display='inline'; Codehighlighter1_421_543_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_421_543_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_421_543_Closed_Text.style.display='none'; Codehighlighter1_421_543_Open_Image.style.display='inline'; Codehighlighter1_421_543_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_421_543_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_421_543_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;we&nbsp;need&nbsp;to&nbsp;step&nbsp;through&nbsp;the&nbsp;rows&nbsp;one&nbsp;row&nbsp;at&nbsp;a&nbsp;time&nbsp;(slow)</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;m&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&nbsp;m&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;firstRow;&nbsp;m</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;)&nbsp;rs.next();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
它和《实现Hibernate分页查询原理解读》中描述的一样，如果你的jdbc支持scrollable，那就调用rs.absolute(firstRow)定位到第一行，否则的话，就一行一行去移动吧。因此在配置文件中有一项很重要：<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.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">prop&nbsp;key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">hibernate.jdbc.use_scrollable_resultset</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">prop</span><span style="COLOR: #000000">&gt;</span></div>
（注意我用的是spring的配置文件）上述这一行其实可以不写，因为默认就是true了，但如果你显示地把它写上了，一定要设为true，如果为false的话，则记录集rs会一行一行去移动，还是很费事的。<br><br>
<img src ="http://www.blogjava.net/caixuetao/aggbug/134704.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caixuetao/" target="_blank">caixuetao</a> 2007-08-06 15:15 <a href="http://www.blogjava.net/caixuetao/articles/134704.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>HibernateTemplate中HibernateCallback的事务</title><link>http://www.blogjava.net/caixuetao/articles/113433.html</link><dc:creator>caixuetao</dc:creator><author>caixuetao</author><pubDate>Wed, 25 Apr 2007 05:42:00 GMT</pubDate><guid>http://www.blogjava.net/caixuetao/articles/113433.html</guid><wfw:comment>http://www.blogjava.net/caixuetao/comments/113433.html</wfw:comment><comments>http://www.blogjava.net/caixuetao/articles/113433.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/caixuetao/comments/commentRss/113433.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caixuetao/services/trackbacks/113433.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 目的:使用HibernateTemplate执行execute(new HibernateCallback())方法，从HibernateCallback中得到session,在此session中做多个操作，并希望这些操作位于同一个事务中。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果你这样写(1)：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs...&nbsp;&nbsp;<a href='http://www.blogjava.net/caixuetao/articles/113433.html'>阅读全文</a><img src ="http://www.blogjava.net/caixuetao/aggbug/113433.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caixuetao/" target="_blank">caixuetao</a> 2007-04-25 13:42 <a href="http://www.blogjava.net/caixuetao/articles/113433.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于条件查询detachedCriteria的一点体会</title><link>http://www.blogjava.net/caixuetao/articles/60631.html</link><dc:creator>caixuetao</dc:creator><author>caixuetao</author><pubDate>Fri, 28 Jul 2006 09:36:00 GMT</pubDate><guid>http://www.blogjava.net/caixuetao/articles/60631.html</guid><wfw:comment>http://www.blogjava.net/caixuetao/comments/60631.html</wfw:comment><comments>http://www.blogjava.net/caixuetao/articles/60631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caixuetao/comments/commentRss/60631.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caixuetao/services/trackbacks/60631.html</trackback:ping><description><![CDATA[假设要通过stuName查询一个学生Student记录，可以如下： 
<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.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"> DetachedCriteria dc </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> DetachedCriteria.forClass(Student.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br />    dc.add(Restrictions.like("stuName", stuName, MatchMode.ANYWHERE));<br />      </span></div><br /> 如果要通过Student的Team的teamName查询一个Student记录，很多人都会这么写：<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.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"> DetachedCriteria dc </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> DetachedCriteria.forClass(Student.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br />    dc.add(Restrictions.like("team.teamName", teamName, MatchMode.ANYWHERE));<br />      </span></div><br />遗憾的是上述程序报错，说是在Student中找不到team.teamName属性，这是可以理解的。那么如何通过teamName查找Student呢？<br />可以这么写：<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.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"> DetachedCriteria dc </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> DetachedCriteria.forClass(Student.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br />    dc.createAlias("team", "t");<br />    dc.add(Restrictions.like("t.teamName", teamName, MatchMode.ANYWHERE));<br />      </span></div>没错，就是要先建立team的引用，才能用team导航到teamName。<br /><br />这里有一个特殊情况，如果是对引用对象的id查询，则可以不用建立引用，也就是可以不调用createAlias()语句，如下所示：<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.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000"> DetachedCriteria dc </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> DetachedCriteria.forClass(Student.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br />    dc.add(Restrictions.like("team.id", teamId, MatchMode.ANYWHERE));<br />      </span></div>据我个人的经验，team后只能跟其主键属性，比较其他属性要用别名。此主键属性可以用“id”字符来指代，也可以用team的主键属性来指代。换句话说，我的Student类的类主键“stuId”，不管是在HQL还是在QBC中，都可以用stu.id来指代stu.stuId。在这里可以看出“id”字符的特殊性。上述是个人观点，并未得到确实的证实。<img src ="http://www.blogjava.net/caixuetao/aggbug/60631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caixuetao/" target="_blank">caixuetao</a> 2006-07-28 17:36 <a href="http://www.blogjava.net/caixuetao/articles/60631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多对一关系中的代理</title><link>http://www.blogjava.net/caixuetao/articles/60320.html</link><dc:creator>caixuetao</dc:creator><author>caixuetao</author><pubDate>Thu, 27 Jul 2006 05:49:00 GMT</pubDate><guid>http://www.blogjava.net/caixuetao/articles/60320.html</guid><wfw:comment>http://www.blogjava.net/caixuetao/comments/60320.html</wfw:comment><comments>http://www.blogjava.net/caixuetao/articles/60320.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caixuetao/comments/commentRss/60320.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caixuetao/services/trackbacks/60320.html</trackback:ping><description><![CDATA[假设Student对Team是多对一的关系，并且&lt;many-to-one&gt;采取的是默认的加载策略(也即proxy)。那么，在session中取得Student后，在session外通过Student取出Team会发生什么情况呢？分三种情况讨论：<br />1.student记录对应的team_id为null。注意：是为null，而不是为""。下面为student表情况：<br />id                    stuName              age                 team_id<br />123abc            tom                     24                   null<br />这个时候调用：<br />log.info(stu.getTeam())打印的是“null”。<br /><br />2. student记录对应的team_id有值，但这个值并没有对应到任何的实体team，比如随便给team_id设一个值“abcd123adfsdaf”。<br />id                    stuName              age                 team_id<br />123abc            tom                     24                   abcd123adfsdaf<br />这个时候调用：<br />log.info(stu.getTeam())<br />弹出异常：“could not initialize proxy - the owning Session was closed”<br /><br />log.info(stu.getTeam().getClass())<br />打印的是“class com.model.Team$$EnhancerByCGLIB$$ee64f4f1”。<br /><br />log.info(stu.getTeam().getId())<br />打印的是“abcd123adfsdaf”<br /><br />log.info(stu.getTeam().getTeamName())<br />弹出异常：“could not initialize proxy - the owning Session was closed”<br /><br />3. student记录对应的team_id有值，而且这个值对应到了一个实体team。<br />id                    stuName              age                 team_id<br />123abc            tom                     24                   402821f90cae6c2b010cae6c31f90001<br />这个时候调用：<br />log.info(stu.getTeam())<br />弹出异常：“could not initialize proxy - the owning Session was closed”<br /><br />log.info(stu.getTeam().getClass())<br />打印的是“class com.model.Team$$EnhancerByCGLIB$$ee64f4f1”。<br /><br />log.info(stu.getTeam().getId())<br />打印的是“402821f90cae6581010cae6588880001”<br /><br />log.info(stu.getTeam().getTeamName())<br />弹出异常：“could not initialize proxy - the owning Session was closed”<br /><br /><br />从上可以看到第2和第三种情况的测试结果是完全一样的，具体的原因比较简单，在此就不再多说。<br />不过有的时候“多对一”的“一”这端可以为null，因此就可以用以下的语句判断：<br />if(student.getTeam()==null)<br />   log.info(“team为null”);<br />else{<br />   Hibernate.initialize(student.getTeam());//这段代码是伪码，我只是想表达这个意思。<br />   log.info(student.getTeam().getTeamName());<br />}<br />  <br /><br /><br /><img src ="http://www.blogjava.net/caixuetao/aggbug/60320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caixuetao/" target="_blank">caixuetao</a> 2006-07-27 13:49 <a href="http://www.blogjava.net/caixuetao/articles/60320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在spring中映射X.hbm.xml文件的小技巧</title><link>http://www.blogjava.net/caixuetao/articles/37790.html</link><dc:creator>caixuetao</dc:creator><author>caixuetao</author><pubDate>Tue, 28 Mar 2006 05:57:00 GMT</pubDate><guid>http://www.blogjava.net/caixuetao/articles/37790.html</guid><wfw:comment>http://www.blogjava.net/caixuetao/comments/37790.html</wfw:comment><comments>http://www.blogjava.net/caixuetao/articles/37790.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/caixuetao/comments/commentRss/37790.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caixuetao/services/trackbacks/37790.html</trackback:ping><description><![CDATA[通常在spring中会这么写代码：<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.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">bean id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sessionFactory</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.springframework.orm.hibernate.LocalSessionFactoryBean</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">mappingResources</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">Student.hbm.xml</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">Course.hbm.xml</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />…<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">property</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />…<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">bean</span><span style="COLOR: #000000">&gt;</span></div>如果X.hbm.xml文件很多时，则写起来会很不方便，可以像下面这种写法就简单多了：(其中假设所有的.hbm.xml文件都存于com/model目录)<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.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">bean id</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sessionFactory</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.springframework.</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">orm.hibernate.LocalSessionFactoryBean</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">property name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">mappingDirectoryLocations</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">classpath:</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">com</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">model</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">value</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">list</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">property</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />…<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">bean</span><span style="COLOR: #000000">&gt;</span></div><img src ="http://www.blogjava.net/caixuetao/aggbug/37790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caixuetao/" target="_blank">caixuetao</a> 2006-03-28 13:57 <a href="http://www.blogjava.net/caixuetao/articles/37790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用GROUP BY子句的规则 </title><link>http://www.blogjava.net/caixuetao/articles/36648.html</link><dc:creator>caixuetao</dc:creator><author>caixuetao</author><pubDate>Tue, 21 Mar 2006 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/caixuetao/articles/36648.html</guid><wfw:comment>http://www.blogjava.net/caixuetao/comments/36648.html</wfw:comment><comments>http://www.blogjava.net/caixuetao/articles/36648.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/caixuetao/comments/commentRss/36648.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/caixuetao/services/trackbacks/36648.html</trackback:ping><description><![CDATA[         使用 GROUP BY 子句时，一定要记住下面的规则：<br /><table cellspacing="2" cellpadding="2" width="498" border="0"><tbody><tr><td valign="center" width="22"></td><td width="476">1.  不能 GROUP BY text、image 或 bit 数据类型的列</td></tr><tr><td valign="center" width="22"></td><td width="476"><font color="#ff1493">2.  SELECT 列表中指定的每一列也必须出现在 GROUP BY 子句中，除非这列是用于聚合函数。</font></td></tr><tr><td valign="center" width="22"></td><td width="476">3.  不能 GROUP BY 列的别名。 这是说 GROUP BY 字段列表中的所有字段必须是实际存在于 FROM 子句中指定的表中的列。</td></tr><tr><td valign="center" width="22"></td><td width="476">4.  进行分组前可以使用 WHERE 子句消除不满足条件的行。</td></tr><tr><td valign="center" width="22"></td><td width="476">5.  使用 GROUP BY 子句返回的组没有特定的顺序。可以使用 ORDER BY 子句指定想要的排序次序。</td></tr></tbody></table><p> </p><img src ="http://www.blogjava.net/caixuetao/aggbug/36648.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/caixuetao/" target="_blank">caixuetao</a> 2006-03-21 15:48 <a href="http://www.blogjava.net/caixuetao/articles/36648.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>