﻿<?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-Rory's Blog-随笔分类-Hibernate</title><link>http://www.blogjava.net/rory/category/11364.html</link><description>Happy study,Happy work,Happy life</description><language>zh-cn</language><lastBuildDate>Wed, 28 Feb 2007 19:55:45 GMT</lastBuildDate><pubDate>Wed, 28 Feb 2007 19:55:45 GMT</pubDate><ttl>60</ttl><item><title>关于Hibernate3的escape解决方法</title><link>http://www.blogjava.net/rory/archive/2006/10/16/hibernate3_escape.html</link><dc:creator>莫多</dc:creator><author>莫多</author><pubDate>Mon, 16 Oct 2006 15:29:00 GMT</pubDate><guid>http://www.blogjava.net/rory/archive/2006/10/16/hibernate3_escape.html</guid><wfw:comment>http://www.blogjava.net/rory/comments/75503.html</wfw:comment><comments>http://www.blogjava.net/rory/archive/2006/10/16/hibernate3_escape.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/rory/comments/commentRss/75503.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rory/services/trackbacks/75503.html</trackback:ping><description><![CDATA[不知道大家有没有碰到，还是没有这种需求。就是用like来查询，我们没有用Lucene,Compass这种全文索引的方案,我们只是简单的添加%进行like查询。用户搜索的时候就使用*和?来代表任意和一个。所以要对"%"和"_"进行转义，我们使用的是oracle数据库。sql语句看起来可能是这样的。<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"><span style="COLOR: #0000ff">SELECT</span><span style="COLOR: #000000"> </span><span style="COLOR: #808080">*</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">FROM</span><span style="COLOR: #000000"> t_user </span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000"> nickname </span><span style="COLOR: #808080">like</span><span style="COLOR: #000000"> </span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">%Goo\_D</span><span style="COLOR: #ff0000">'</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">escape</span><span style="COLOR: #000000"> </span><span style="COLOR: #ff0000">'</span><span style="COLOR: #ff0000">\</span><span style="COLOR: #ff0000">'</span></div>这里对_进行转义了。因为用户昵称包含下划线，如果不进行转义就表示一个任意字符。有时候我们可能还需要对%进行转义。同样的方法在%前加\% 但是比起普通的like语句。多了一个声明转义符的语句。所以我们会想到这样的语句<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"><span style="COLOR: #000000">DetachedCriteria criteria </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> DetachedCriteria.forClass(User.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br />criteria.add(Restrictions.like(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">nickname</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, user.getNickname()</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">' escape'\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));</span></div>但是这样是不管用的。<br />接下来可能会想到使用Hibernate3的原生sql查询，其实我们不需要这样做。我们还是使用Criteria条件查询。<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"><span style="COLOR: #000000">criteria.add(Restrictions.sqlRestriction(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">{alias}.nickname like ? escape'/'</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, StringUtil.escapeSQLLike(user.getNickname()), Hibernate.STRING));</span></div>这样Hibernate产生的语句就是我们想要的语句了。<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"><span style="COLOR: #000000">    </span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />     * 转义like语句中的<br />     * &lt;code&gt;'_'&lt;/code&gt;&lt;code&gt;'%'&lt;/code&gt;<br />     * 将&lt;code&gt;'?'&lt;/code&gt;转成sql的&lt;code&gt;'/_'&lt;/code&gt;<br />     * 将&lt;code&gt;'%'&lt;/code&gt;转成sql的&lt;code&gt;'/%'&lt;/code&gt;<br />     * &lt;p&gt;<br />     *   例如搜索&lt;code&gt;?aa*bb?c_d%f&lt;/code&gt;将转化成&lt;br/&gt;<br />     *   &lt;code&gt;_aa%bb_c/_d/%f&lt;/code&gt;<br />     * &lt;/p&gt;<br />     * </span><span style="COLOR: #808080">@param</span><span style="COLOR: #008000"> likeStr<br />     * </span><span style="COLOR: #808080">@return</span><span style="COLOR: #008000"><br />     * </span><span style="COLOR: #808080">@author</span><span style="COLOR: #008000"> &lt;a href="</span><span style="COLOR: #008000; TEXT-DECORATION: underline">http://jdkcn.com</span><span style="COLOR: #008000">"&gt;somebody&lt;/a&gt;<br />     </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> String escapeSQLLike(String likeStr) {<br />        String str </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> StringUtils.replace(likeStr, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">_</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/_</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />        str </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> StringUtils.replace(str, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,    </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/%</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />        str </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> StringUtils.replace(str, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">_</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />        str </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> StringUtils.replace(str, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> str;<br />    }</span></div><br /><a href="http://www.creativecommons.cn/licenses/by-nc-sa/1.0/" target="_blank"><img height="31" alt="创造共用协议:署名,非商业,保持一致" src="http://leaf.jdk.cn/rights.gif" width="88" border="0" /></a>   除经特别注明外,本文章版权归<strong><a class="" href="http://jdkcn.com/"><font color="#6b6b52">莫多泡泡</font></a></strong>所有. <br /><font color="#ff0000">署名,非商业用途,保持一致.</font>   <a title="莫多泡泡" href="http://jdkcn.com" target="_blank">somebody(莫多)</a><img src ="http://www.blogjava.net/rory/aggbug/75503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rory/" target="_blank">莫多</a> 2006-10-16 23:29 <a href="http://www.blogjava.net/rory/archive/2006/10/16/hibernate3_escape.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于Hibernate3的NativeSQL查询是如此简单</title><link>http://www.blogjava.net/rory/archive/2006/05/26/48274.html</link><dc:creator>莫多</dc:creator><author>莫多</author><pubDate>Fri, 26 May 2006 02:33:00 GMT</pubDate><guid>http://www.blogjava.net/rory/archive/2006/05/26/48274.html</guid><wfw:comment>http://www.blogjava.net/rory/comments/48274.html</wfw:comment><comments>http://www.blogjava.net/rory/archive/2006/05/26/48274.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rory/comments/commentRss/48274.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rory/services/trackbacks/48274.html</trackback:ping><description><![CDATA[现在的系统中虽然使用了。Hibernate但是没有使用Hibernate的关联关系来进行数据库操作。所有的管理操作都是单独实现的。所以也不能用Criteria.add()这种方式去查询关联的一方。所以只能用Native SQL去查询结果返回对象了。按照Hibernate3的reference里面说的<br /><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="CLEAR: both"><font color="#006400">16.1. 使用<tt class="literal">SQLQuery</tt></font></h2></div></div><div><font color="#006400"></font></div></div><p><font color="#006400">对原生SQL查询执行的控制是通过<tt class="literal">SQLQuery</tt>接口进行的，通过执行<tt class="literal">Session.createSQLQuery()</tt>获取这个接口。最简单的情况下，我们可以采用以下形式：</font></p><pre class="programlisting"><font color="#006400">List cats = sess.createSQLQuery("select * from cats")
    .addEntity(Cat.class)
    .list();</font></pre><p><font color="#006400">这个查询指定了:</font></p><div class="itemizedlist"><ul type="disc"><li><p><font color="#006400">SQL查询字符串</font></p></li><li><p><font color="#006400">查询返回的实体</font></p></li></ul></div><p><font color="#006400">这里，结果集字段名被假设为与映射文件中指明的字段名相同。对于连接了多个表的查询，这就可能造成问题，因为可能在多个表中出现同样名字的字段。下面的方法就可以避免字段名重复的问题:</font></p><pre class="programlisting"><font color="#006400">List cats = sess.createSQLQuery("select {cat.*} from cats cat")
    .addEntity("cat", Cat.class)
    .list();</font></pre><p><font color="#006400">这个查询指定了: </font></p><div class="itemizedlist"><ul type="disc"><li><p><font color="#006400">SQL查询语句，它带一个占位符，可以让Hibernate使用字段的别名. </font></p></li><li><p><font color="#006400">查询返回的实体，和它的SQL表的别名. </font></p></li></ul></div><p><font color="#006400"><tt class="literal">addEntity()</tt>方法将SQL表的别名和实体类联系起来，并且确定查询结果集的形态。 </font></p><p><font color="#006400"><tt class="literal">addJoin()</tt>方法可以被用于载入其他的实体和集合的关联. </font></p><pre class="programlisting"><font color="#006400">List cats = sess.createSQLQuery(
        "select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id"
    )
    .addEntity("cat", Cat.class)
    .addJoin("kitten", "cat.kittens")
    .list();</font></pre><p><font color="#006400">原生的SQL查询可能返回一个简单的标量值或者一个标量和实体的结合体。 </font></p><pre class="programlisting"><font color="#006400">Double max = (Double) sess.createSQLQuery("select max(cat.weight) as maxWeight from cats cat")
        .addScalar("maxWeight", Hibernate.DOUBLE);
        .uniqueResult();</font></pre><p><font color="#006400">除此之外，你还可以在你的hbm文件中描述结果集映射信息，在查询中使用。</font></p><pre class="programlisting"><font color="#006400">List cats = sess.createSQLQuery(
        "select {cat.*}, {kitten.*} from cats cat, cats kitten where kitten.mother = cat.id"
    )
    .setResultSetMapping("catAndKitten")
    .list();<br /></font></pre></div><br />后来我使用了命名SQL查询方式。<br /><div class="titlepage"><div><div><h2 class="title" style="CLEAR: both"><font color="#006400">16.3. 命名SQL查询</font></h2></div></div><div><font color="#006400"></font></div></div><p><font color="#006400">可以在映射文档中定义查询的名字,然后就可以象调用一个命名的HQL查询一样直接调用命名SQL查询.在这种情况下,我们<span class="emphasis"><em>不</em></span> 需要调用<tt class="literal">addEntity()</tt>方法. </font></p><pre class="programlisting"><font color="#006400">&lt;sql-query name="persons"&gt;
    &lt;return alias="person" class="eg.Person"/&gt;
    SELECT person.NAME AS {person.name},
           person.AGE AS {person.age},
           person.SEX AS {person.sex}
    FROM PERSON person
    WHERE person.NAME LIKE :namePattern
&lt;/sql-query&gt;</font></pre><pre class="programlisting"><font color="#006400">List people = sess.getNamedQuery("persons")
    .setString("namePattern", namePattern)
    .setMaxResults(50)
    .list();</font><br /><br />我觉得这种发式比较好。这样写出来的sql可以很整齐。我们的数据库使用的是oracle，不过按照这上面的写法发现sql语句有错误。<br />后来拿到控制台执行也抱错。因为原来都用sqlserver，而sqlserver都是可以的。后来发现是表不能有别名改成这样就好了。<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"><span style="COLOR: #000000">            </span><span style="COLOR: #0000ff">SELECT</span><span style="COLOR: #000000"> T_PAY.sys_id </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> {pay.sysId},<br />                   T_PAY.sys_flag </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> {pay.sysFlag},<br />                   T_PAY.sys_domain </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> {pay.sysDomain},<br />                   T_PAY.sys_owner </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> {pay.sysOwner},<br />                   T_PAY.sys_create_date </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> {pay.sysCreateDate},<br />                   T_PAY.sys_update_date </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> {pay.sysUpdateDate},<br />                   T_PAY.pay_id </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> {pay.payId},<br />                   T_PAY.pay_name </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> {pay.payName},<br />                   T_PAY.pay_type_id </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> {pay.payTypeId},<br />                   T_PAY.pay_date </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> {pay.payDate},<br />                   T_PAY.money_type_id </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> {pay.moneyTypeId},<br />                   T_PAY.amount </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> {pay.amount},<br />                   T_PAY.payer_id </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> {pay.payerId},<br />                   T_PAY.payer_name </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> {pay.payerName},<br />                   T_PAY.accept_id </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> {pay.acceptId},<br />                   T_PAY.accept_name </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> {pay.acceptName},<br />                   T_PAY.pay_state_id </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> {pay.payStateId},<br />                   T_PAY.remark </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> {pay.remark}<br />            </span><span style="COLOR: #0000ff">FROM</span><span style="COLOR: #000000">   T_PAY<br />            </span><span style="COLOR: #0000ff">JOIN</span><span style="COLOR: #000000">   T_BIZ_PAY<br />            </span><span style="COLOR: #0000ff">ON</span><span style="COLOR: #000000">       T_PAY.pay_id </span><span style="COLOR: #808080">=</span><span style="COLOR: #000000"> T_BIZ_PAY.pay_id<br />            </span><span style="COLOR: #0000ff">WHERE</span><span style="COLOR: #000000">  T_BIZ_PAY.biz_id </span><span style="COLOR: #808080">=</span><span style="COLOR: #000000"> :bizId</span></div></pre>  <strong>这里要特别的提醒一下大家千万不要把主键忘了。刚开始我就忘了主键，后来调试了半天才找出原因来。<br /></strong><br />这样在sping里面用回调查询一下就ok了。真的很方便.<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"><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> List getPaysByBizId(</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> String bizId) {<br />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> (List)getHibernateTemplate().execute(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> HibernateCallback(){<br />            </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Object doInHibernate(Session session)</span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> HibernateException{<br />                Query query </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> session.getNamedQuery(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">find.pays.by.bizid</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />                query.setParameter(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">bizId</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,bizId);<br />                </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> query.list();<br />            }<br />        },</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br />    }</span></div><img src ="http://www.blogjava.net/rory/aggbug/48274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rory/" target="_blank">莫多</a> 2006-05-26 10:33 <a href="http://www.blogjava.net/rory/archive/2006/05/26/48274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>今天发现一个hibernate的bug,或者说一个应该注意的地方比较合适</title><link>http://www.blogjava.net/rory/archive/2006/05/21/47339.html</link><dc:creator>莫多</dc:creator><author>莫多</author><pubDate>Sun, 21 May 2006 14:49:00 GMT</pubDate><guid>http://www.blogjava.net/rory/archive/2006/05/21/47339.html</guid><wfw:comment>http://www.blogjava.net/rory/comments/47339.html</wfw:comment><comments>http://www.blogjava.net/rory/archive/2006/05/21/47339.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/rory/comments/commentRss/47339.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rory/services/trackbacks/47339.html</trackback:ping><description><![CDATA[今天把myblog用sql server部署了一下，可是发现分页查询的时候出现错误，看控制台报错说语句有错,由来发现分页的时候先查询总记录数目的那条语句出错了<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"><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000"> </span><span style="COLOR: #ff00ff">count</span><span style="COLOR: #000000">(</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">) </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> y0_ </span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000"> myblog_Blog this_ </span><span style="COLOR: #0000ff">inner</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">join</span><span style="COLOR: #000000"> myblog_Blog_Category categories3_ </span><span style="COLOR: #0000ff">on</span><span style="COLOR: #000000"> this_.id</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">categories3_.blogId </span><span style="COLOR: #0000ff">inner</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">join</span><span style="COLOR: #000000"> myblog_Category category1_ </span><span style="COLOR: #0000ff">on</span><span style="COLOR: #000000"> categories3_.categoryId</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">category1_.id </span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000"> category1_.id</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">? </span><span style="COLOR: #0000ff">order</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">by</span><span style="COLOR: #000000"> this_.postTime </span><span style="COLOR: #0000ff">desc</span></div>      原来开发的时候我是用的mysql，没有任何问题。原因就在最后面的order by 语句，sql server 在select count(*)里面不能用 order by。然后跟踪代码发现:<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"><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> PaginationSupport getBlogsByCategoryByPage(</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> String categoryId, </span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> startIndex, </span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> pageSize) {<br />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> (PaginationSupport) getHibernateTemplate().execute(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> HibernateCallback() {<br />            </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Object doInHibernate(Session session) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> HibernateException {<br />                Criteria criteria </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> session.createCriteria(Blog.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br />                Criteria cateCriteria </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> criteria.createCriteria(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">categories</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />                cateCriteria.add(Expression.eq(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">id</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,categoryId));<br />                criteria.addOrder(Order.desc(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">postTime</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br />                </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> totalCount </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ((Integer) criteria.setProjection(Projections.rowCount())<br />                        .uniqueResult()).intValue();<br />                criteria.setProjection(</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);<br />                <br />                List items </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();<br />                List blogs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArrayList();<br />                </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(Iterator ite </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> items.iterator(); ite.hasNext();) {<br />                    Object[] objs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (Object[])ite.next();<br />                    blogs.add(objs[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]);<br />                }<br />                PaginationSupport ps </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> PaginationSupport(blogs, totalCount, pageSize, startIndex);<br />                </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> ps;<br />            }<br />        }, </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br />    }</span></div>原来问题就在Criteria.addOrder(Order.desc("postTime"));这句话的位置上面，int totalCount = ((Integer) criteria.setProjection(Projections.rowCount())<br />      .uniqueResult()).intValue();<br />这句话的时候就会生成上面那句话，如果在这之前addOrder就会出现问题，如果你用mysql不会出现问题，如果你用sql server就会报错。解决方法就是把addOrder语句放到totalCount下面就可以了。<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"><span style="COLOR: #000000">    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> PaginationSupport getBlogsByCategoryByPage(</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> String categoryId, </span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> startIndex, </span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> pageSize) {<br />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> (PaginationSupport) getHibernateTemplate().execute(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> HibernateCallback() {<br />            </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Object doInHibernate(Session session) </span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000"> HibernateException {<br />                Criteria criteria </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> session.createCriteria(Blog.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);<br />                Criteria cateCriteria </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> criteria.createCriteria(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">categories</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />                cateCriteria.add(Expression.eq(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">id</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,categoryId));<br />                </span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> totalCount </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> ((Integer) criteria.setProjection(Projections.rowCount())<br />                        .uniqueResult()).intValue();<br />                criteria.setProjection(</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);<br />                <br />                </span><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br />                 * Fix a bug ,Order must add after get the totalCount,<br />                 * beacuse SqlServer not support order by in the select count(*).<br />                 </span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />                criteria.addOrder(Order.desc(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">postTime</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br />                List items </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> criteria.setFirstResult(startIndex).setMaxResults(pageSize).list();<br />                List blogs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> ArrayList();<br />                </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(Iterator ite </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> items.iterator(); ite.hasNext();) {<br />                    Object[] objs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> (Object[])ite.next();<br />                    blogs.add(objs[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]);<br />                }<br />                PaginationSupport ps </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> PaginationSupport(blogs, totalCount, pageSize, startIndex);<br />                </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> ps;<br />            }<br />        }, </span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br />    }</span></div><br />这样生成的sql语句就是这样的。<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"><span style="COLOR: #0000ff">select</span><span style="COLOR: #000000"> </span><span style="COLOR: #ff00ff">count</span><span style="COLOR: #000000">(</span><span style="COLOR: #808080">*</span><span style="COLOR: #000000">) </span><span style="COLOR: #0000ff">as</span><span style="COLOR: #000000"> y0_ </span><span style="COLOR: #0000ff">from</span><span style="COLOR: #000000"> myblog_Blog this_ </span><span style="COLOR: #0000ff">inner</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">join</span><span style="COLOR: #000000"> myblog_Blog_Category categories3_ </span><span style="COLOR: #0000ff">on</span><span style="COLOR: #000000"> this_.id</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">categories3_.blogId </span><span style="COLOR: #0000ff">inner</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">join</span><span style="COLOR: #000000"> myblog_Category category1_ </span><span style="COLOR: #0000ff">on</span><span style="COLOR: #000000"> categories3_.categoryId</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">category1_.id </span><span style="COLOR: #0000ff">where</span><span style="COLOR: #000000"> category1_.id</span><span style="COLOR: #808080">=</span><span style="COLOR: #000000">?</span></div><br />以后大家也要注意了。呵呵。<br /><img src ="http://www.blogjava.net/rory/aggbug/47339.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rory/" target="_blank">莫多</a> 2006-05-21 22:49 <a href="http://www.blogjava.net/rory/archive/2006/05/21/47339.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>