﻿<?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-ice world-随笔分类-Hibernate</title><link>http://www.blogjava.net/icewee/category/49007.html</link><description>There is nothing to difficult if you put your heart into it.</description><language>zh-cn</language><lastBuildDate>Sat, 09 Jul 2011 15:01:07 GMT</lastBuildDate><pubDate>Sat, 09 Jul 2011 15:01:07 GMT</pubDate><ttl>60</ttl><item><title>Hibernate Criteria分页产生的问题</title><link>http://www.blogjava.net/icewee/archive/2011/04/16/353240.html</link><dc:creator>IceWee</dc:creator><author>IceWee</author><pubDate>Fri, 15 Apr 2011 18:26:00 GMT</pubDate><guid>http://www.blogjava.net/icewee/archive/2011/04/16/353240.html</guid><wfw:comment>http://www.blogjava.net/icewee/comments/353240.html</wfw:comment><comments>http://www.blogjava.net/icewee/archive/2011/04/16/353240.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/icewee/comments/commentRss/353240.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/icewee/services/trackbacks/353240.html</trackback:ping><description><![CDATA[<span style="font-family: verdana,geneva; font-size: 12pt">大家都知道做分页必须要知道总记录数，这就为我们出了一到小题儿，往往我们直接用Criteria调用list方法就返回全部查询结果了，但是分页必须在返回列表之前得到总行数。我之前的做法是写两个方法，参数完全一样，一个返回 Integer，也就是记录数，一个返回List，结果集。这样写感觉挺麻烦的，还有人直接用criteria.list()返回记录数，再设置分页属性，那样还叫什么分页啊，调用list已经将数据加载到内存了，那不又成了内存分页，这种做法程序处理简单了，性能降下来了。</span> 
<div id="blog_text" class="cnt">
<p><span style="font-family: verdana,geneva; font-size: 12pt">今天在网上闲逛发现了一个新招，代码如下（只贴出回调函数里的代码了）：</span></p>
<p><span style="font-family: verdana,geneva; font-size: 14px"><em><span style="color: #8c8c8c; font-size: 12pt">灰色</span><span style="color: #8c8c8c; font-size: 12pt">斜体</span></em></span><span style="font-family: verdana,geneva; font-size: 12pt">为业务相关代码，请无视</span></p>
<p><span style="font-family: verdana,geneva; font-size: 12pt">public Object doInHibernate(Session session) throws HibernateException, SQLException {</span><br /><span style="font-family: verdana,geneva; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;Criteria criteria = session.createCriteria(XtLog.class);</span><br /><span style="font-family: verdana,geneva; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;Criteria userCriteria = criteria.createCriteria("xtUser");</span><br /><span style="font-family: verdana,geneva; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;Criteria lcCriteria = criteria.createCriteria("xtLogClass");</span><br /><span style="font-family: verdana,geneva; font-size: 14px">&nbsp;&nbsp;<span style="color: #8c8c8c">&nbsp;</span><em><span style="color: #8c8c8c; font-size: 12pt">&nbsp;if (StringUtils.isNotBlank(userId)) {</span><br /><span style="color: #8c8c8c; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;userCriteria.add(Restrictions.like("userId", userId, MatchMode.START));</span><br /><span style="color: #8c8c8c; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="color: #8c8c8c; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;if (StringUtils.isNotBlank(logClassId)) {</span><br /><span style="color: #8c8c8c; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lcCriteria.add(Restrictions.eq("logClassId", logClassId));</span><br /><span style="color: #8c8c8c; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="color: #8c8c8c; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;if (beginDate != null &amp;&amp; endDate != null) {</span><br /><span style="color: #8c8c8c; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.add(Restrictions.between("xtOplogtime", beginDate, endDate));</span><br /><span style="color: #8c8c8c; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;}</span></em></span><br /><span style="font-family: verdana,geneva; color: #00cc22; font-size: 14px">&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #005916; font-size: 12pt">int totalRows =((Integer) criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();</span></strong></span><br /><span style="font-family: verdana,geneva; font-size: 14px">&nbsp;&nbsp;&nbsp;&nbsp;<em><span style="color: #8c8c8c; font-size: 12pt">psm.setTotalRows(totalRows);&nbsp;&nbsp;// 业务代码，请无视</span></em></span><br /><span style="font-family: verdana,geneva; font-size: 14px">&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #005916; font-size: 12pt">criteria.setProjection(null);</span></strong></span><br /><span style="font-family: verdana,geneva; font-size: 14px">&nbsp;&nbsp;&nbsp;&nbsp;<strong><span style="color: #ff0000; font-size: 12pt">criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);</span></strong></span><br /><span style="font-family: verdana,geneva; font-size: 14px">&nbsp;&nbsp;&nbsp;<em><span style="color: #8c8c8c; font-size: 12pt">&nbsp;Map&lt;String, String&gt; orderMap = psm.getOrderMap();</span><br /><span style="color: #8c8c8c; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;if(orderMap != null){</span><br /><span style="color: #8c8c8c; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setOrder(criteria, userCriteria, lcCriteria, orderMap);</span><br /><span style="color: #8c8c8c; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;}</span></em></span><br /><span style="font-family: verdana,geneva; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;if(!psm.isAll()){&nbsp;&nbsp;// 分页</span><br /><span style="font-family: verdana,geneva; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.setFirstResult(psm.getRowStart());</span><br /><span style="font-family: verdana,geneva; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;criteria.setMaxResults(psm.getPageSize());</span><br /><span style="font-family: verdana,geneva; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: verdana,geneva; color: #143066; font-size: 12pt">//&nbsp;&nbsp;&nbsp;&nbsp;List&lt;XtLog&gt; logs = new ArrayList&lt;XtLog&gt;();&nbsp;// 返回日志列表</span><br /><span style="font-family: verdana,geneva; color: #143066; font-size: 12pt">//&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Object[]&gt; list = criteria.list();</span><br /><span style="font-family: verdana,geneva; color: #143066; font-size: 12pt">//&nbsp;&nbsp;&nbsp;&nbsp;for (Object[] o : list) {</span><br /><span style="font-family: verdana,geneva; color: #143066; font-size: 12pt">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logs.add((XtLog) o[2]);</span><br /><span style="font-family: verdana,geneva; color: #143066; font-size: 12pt">//&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: verdana,geneva; color: #143066; font-size: 12pt">//&nbsp;&nbsp;&nbsp;&nbsp;return logs;</span><br /><span style="font-family: verdana,geneva; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;return criteria.list();</span><br /><span style="font-family: verdana,geneva; font-size: 12pt">}<br /><br /></span></p>
<p><span style="font-family: verdana,geneva"><span style="font-size: 12pt">请注意<strong><span style="color: #005916; font-size: 12pt">绿色</span><span style="color: #005916; font-size: 12pt">加粗</span></strong></span><span style="font-size: 12pt">那两行代码，那就是hibernate获取记录总行数的写法，直接和获取列表的方法写在一起，貌似很简洁，很给力，如果你查询的就是一张表，那么没事了，但我查询的日志是要关联到用户和日志分类的，最上面那三行代码就是关联了，这时发现返回到页面后报错了，原因是返回的并不是我要的日志List，而是 Object[]的List，每个List里三个对象数组，主表的数组下标是最后一个，这时我就得使用<span style="color: #143066; font-size: 12pt">蓝色字体</span></span><span style="font-size: 12pt">的代码重新封装后返回，我感觉这样虽然解决了该问题，但还是不给力，不完美，不pe</span></span><span style="font-family: verdana,geneva; font-size: 12pt">rfect，就是不爽，于是请将注意力转移到<strong><span style="color: #ff0000; font-size: 12pt">红色</span><span style="color: #ff0000; font-size: 12pt">加粗</span></strong></span><span style="font-family: verdana,geneva; font-size: 12pt">字体上，写上它就OK了。</span></p></div><img src ="http://www.blogjava.net/icewee/aggbug/353240.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/icewee/" target="_blank">IceWee</a> 2011-04-16 02:26 <a href="http://www.blogjava.net/icewee/archive/2011/04/16/353240.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>