﻿<?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-&lt;font color="red"&gt;中國男人&lt;/font&gt;&lt;font color="lightgreen"&gt;大鹏一曰同风起，扶摇直上九万里&lt;/font&gt;-随笔分类-Hibernate</title><link>http://www.blogjava.net/liaojiyong/category/12345.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 29 Mar 2007 11:18:55 GMT</lastBuildDate><pubDate>Thu, 29 Mar 2007 11:18:55 GMT</pubDate><ttl>60</ttl><item><title>Hibernate O/R映射三大基本定则(转)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/29/107230.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 29 Mar 2007 07:06:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/29/107230.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/107230.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/29/107230.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/107230.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/107230.html</trackback:ping><description><![CDATA[1. 引言<br />在Java环境下，有多种对象关系映射方法，如实体Bean、OJB、JDO、JDBC等。Hibernate是一种新的O/R映射工具，它不仅提供了从Java类到数据表的映射，也提供了数据查询和恢复等机制。Hibernate非常简单易学,目前国内有很多同行已经或正在用Hibernate开发实施项目;但Hibernate有很多规则不为人知或应用甚少。本文的目的就是将这些规则归纳总结,希望对您的开发和设计有益。<br /><br />首先声明,本文是Hibernate入门级文章,高手请不用往下看了。<br /><br />2. 基本定则<br /><br />定则一:数据库配置文件名称可以不是Hibernate.properties或Hibernate.cfg.xml<br /><br />由于Hibernate官方文档(本文指www.hibernate.org的文档)的影响,很多Hibernate开发者误以为系统一定要有名称为Hibernate.properties或Hibernate.cfg.xml的文件,而且一定要放在classes的根目录下。实际上,该文件只是一般的配置文件,名称可以自己取,文件位置可以自己定,而且在多数据库环境下,可以有多个配置文件,使得程序可以连接多个数据库。只是您在创建会话工厂时需要特殊处理,代码示例如下:<br /><br />//配置文件名称<br /><br />protected static String CONFIG_FILE = "my_hibernate.config";<br /><br />//配置文件目录,可以考虑在该目录下存放系统所有配置文件,此处使用虚拟机参数<br /><br />String configPath = System.getProperty("my.config"); <br /><br />//创建会话工厂 <br /><br />sessionFactory =( new Configuration().configure(new File(configPath+File.separator+CONFIG_FILE))) .buildSessionFactory();<br /><br /><br /><br />定则二:小型项目中,.hbm.xml文件可以合并到一个文件中<br /><br />同样由于Hibernate官方文档的影响,很多Hibernate开发者误以为Hibernate的对象关系映射一定要一个表对应一个对象,并将映射文件和对象文件放在同一目录下。实际上,该模式是为规范性考虑而设计的,因为在多人参与的项目中,多人要维护同一文件容易产生冲突;当项目比较小时,配置文件的维护人员少,我们完全可以将.hbm.xml文件合并到一个或者几个文件中。依据作者本人的项目设计开发经验,最好是项目中有几人同时从事O/R映射和持久工作,则设定几个.hbm.xml文件,每人维护一个。当然,为了便于分类和管理,每人的工作应该按逻辑划分。<br /><br />大型项目中的文件配置示例如下:<br /><br />&lt;hibernate-configuration&gt;<br /><br />&lt;session-factory&gt;<br /><br />&lt;!—映射文件分散 --&gt;<br /><br />&lt;mapping resource="com/hongsoft/test/ persistence/Cat.hbm.xml"/&gt;<br /><br />&lt;mapping resource="com/hongsoft/test/ persistence/Animal.hbm.xml"/&gt;<br /><br />&lt;/session-factory&gt;<br /><br />&lt;/hibernate-configuration&gt;<br /><br />小型项目中的文件配置示例如下:<br /><br />&lt;hibernate-configuration&gt;<br /><br />&lt;session-factory&gt;<br /><br />&lt;!—映射文件集中 --&gt;<br /><br />&lt;mapping resource="res_hibernate_map.xml"/&gt;<br /><br />&lt;/session-factory&gt;<br /><br />&lt;/hibernate-configuration&gt;<br /><br />要注意的是, 从对Hibernate源代码的分析可知,指定映射文件时,不能用绝对目录,只能用相对目录;而且,系统以classes根目录为当前目录。<br /><br /><br /><br />定则三:对象关系映射是以.hbm.xml文件为基准的,而不是以PO文件为基准<br /><br />该定律的意思是:系统启动检查您的对象关系映射是否正确时,是以.hbm.xml为基准来进行检查的;对象文件的property可以比映射文件的property多,但不能少。如果您有如下的映射:<br /><br />&lt;class name="com.hongsoft.test.User" table="res_user"&gt;<br /><br />&lt;id name="id" column="id" type="long" unsaved-value="any"&gt;<br /><br />&lt;generator class="assigned"&gt; <br /><br />&lt;/generator&gt; <br /><br />&lt;/id&gt;<br /><br />&lt;property name="name"/&gt; <br /><br />&lt;property name="loginName"/&gt;<br /><br />&lt;property name="passwd"/&gt; <br /><br />&lt;/class&gt;<br /><br />系统启动,检查数据库和其他配置正确后,将以该文件为基准,首先检查User对象中有无id属性和对应的get/set方法,如果没有则报错,如果有且正确则检查有无name属性和对应的get/set方法……,直到文件结束。要注意的是,如果属性为name,则get方法名称必须为getName(),set方法名称必须为setName(),否则会报错。<br /><br />如果User对象除了有id,name,loginName, passwd四个属性和对应的方法,还有其它的属性和方法,会报错吗?不会,因为对象关系映射是以.hbm.xml文件为基准的,而不是以PO文件为基准。您在项目中可以充分利用该特点,实现您自己的比较特殊的需求。例如,您可以在User对象中加入updatedPasswd表示更改后的口令,由此构造在表示层要使用的FormBean和在业务层要使用的ValueObject。当然,这样做也有缺点,需要根据您的实际情况而定。<br /><br />3. 总结<br />上面是作者对Hibernate映射的容易理解错误的知识点的归纳总结,希望对您有帮助。如果您发现有错误或有自己的观点,欢迎讨论。<br /><img src ="http://www.blogjava.net/liaojiyong/aggbug/107230.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-29 15:06 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/29/107230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate程序性能优化的考虑要点(转) </title><link>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105725.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 23 Mar 2007 01:48:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105725.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/105725.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/03/23/105725.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/105725.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/105725.html</trackback:ping><description><![CDATA[本文依照HIBERNATE帮助文档，一些网络书籍及项目经验整理而成，只提供要点和思路，具体做法可以留言探讨，或是找一些更详细更有针对性的资料。 
<p>　　初用HIBERNATE的人也许都遇到过性能问题，实现同一功能，用HIBERNATE与用JDBC性能相差十几倍很正常，如果不及早调整，很可能影响整个项目的进度。</p><p>　　大体上，对于HIBERNATE性能调优的主要考虑点如下:</p><p>　　Ø 数据库设计调整</p><p>　　Ø HQL优化</p><p>　　Ø API的正确使用(如根据不同的业务类型选用不同的集合及查询API)</p><p>　　Ø 主配置参数(日志，查询缓存，fetch_size, batch_size等)</p><p>　　Ø 映射文件优化(ID生成策略，二级缓存，延迟加载，关联优化)</p><p>　　Ø 一级缓存的管理</p><p>　　Ø 针对二级缓存，还有许多特有的策略</p><p>　　Ø 事务控制策略。</p><p>　　1、 数据库设计</p><p>　　a) 降低关联的复杂性</p><p>　　b) 尽量不使用联合主键</p><p>　　c) ID的生成机制，不同的数据库所提供的机制并不完全一样</p><p>　　d) 适当的冗余数据，不过分追求高范式</p><p>　　2、 HQL优化</p><p>　　HQL如果抛开它同HIBERNATE本身一些缓存机制的关联，HQL的优化技巧同普通的SQL优化技巧一样，可以很容易在网上找到一些经验之谈。</p><p>　　3、 主配置</p><p>　　a) 查询缓存，同下面讲的缓存不太一样，它是针对HQL语句的缓存，即完全一样的语句再次执行时可以利用缓存数据。但是，查询缓存在一个交易系统(数据变更频繁，查询条件相同的机率并不大)中可能会起反作用:它会白白耗费大量的系统资源但却难以派上用场。</p><p>　　b) fetch_size，同JDBC的相关参数作用类似，参数并不是越大越好，而应根据业务特征去设置</p><p>　　c) batch_size同上。</p><p>　　d) 生产系统中，切记要关掉SQL语句打印。</p><p>　　4、 缓存</p><p>　　a) 数据库级缓存:这级缓存是最高效和安全的，但不同的数据库可管理的层次并不一样，比如，在ORACLE中，可以在建表时指定将整个表置于缓存当中。</p><p>　　b) SESSION缓存:在一个HIBERNATE SESSION有效，这级缓存的可干预性不强，大多于HIBERNATE自动管理，但它提供清除缓存的方法，这在大批量增加/更新操作是有效的。比如，同时增加十万条记录，按常规方式进行，很可能会发现OutofMemeroy的异常，这时可能需要手动清除这一级缓存:Session.evict以及Session.clear</p><p>　　c) 应用缓存:在一个SESSIONFACTORY中有效，因此也是优化的重中之重，因此，各类策略也考虑的较多，在将数据放入这一级缓存之前，需要考虑一些前提条件:</p><p>　　i. 数据不会被第三方修改(比如，是否有另一个应用也在修改这些数据?)</p><p>　　ii. 数据不会太大</p><p>　　iii. 数据不会频繁更新(否则使用CACHE可能适得其反)</p><p>　　iv. 数据会被频繁查询</p><p>　　v. 数据不是关键数据(如涉及钱，安全等方面的问题)。</p><p>　　缓存有几种形式，可以在映射文件中配置:read-only(只读，适用于很少变更的静态数据/历史数据)，nonstrict-read-write，read-write(比较普遍的形式，效率一般)，transactional(JTA中，且支持的缓存产品较少)</p><p>　　d) 分布式缓存:同c)的配置一样，只是缓存产品的选用不同，在目前的HIBERNATE中可供选择的不多，oscache, jboss cache，目前的大多数项目，对它们的用于集群的使用(特别是关键交易系统)都持保守态度。在集群环境中，只利用数据库级的缓存是最安全的。</p><p>　　5、 延迟加载</p><p>　　a) 实体延迟加载:通过使用动态代理实现</p><p>　　b) 集合延迟加载:通过实现自有的SET/LIST，HIBERNATE提供了这方面的支持</p><p>　　c) 属性延迟加载:</p><p>　　6、 方法选用</p><p>　　a) 完成同样一件事，HIBERNATE提供了可供选择的一些方式，但具体使用什么方式，可能用性能/代码都会有影响。显示，一次返回十万条记录(List/Set/Bag/Map等)进行处理，很可能导致内存不够的问题，而如果用基于游标(ScrollableResults)或Iterator的结果集，则不存在这样的问题。</p><p>　　b) Session的load/get方法，前者会使用二级缓存，而后者则不使用。</p><p>　　c) Query和list/iterator，如果去仔细研究一下它们，你可能会发现很多有意思的情况，二者主要区别(如果使用了Spring，在HibernateTemplate中对应find,iterator方法):</p><p>　　i. list只能利用查询缓存(但在交易系统中查询缓存作用不大)，无法利用二级缓存中的单个实体，但list查出的对象会写入二级缓存，但它一般只生成较少的执行SQL语句，很多情况就是一条(无关联)。</p><p>　　ii. iterator则可以利用二级缓存，对于一条查询语句，它会先从数据库中找出所有符合条件的记录的ID，再通过ID去缓存找，对于缓存中没有的记录，再构造语句从数据库中查出，因此很容易知道，如果缓存中没有任何符合条件的记录，使用iterator会产生N+1条SQL语句(N为符合条件的记录数)</p><p>　　iii. 通过iterator，配合缓存管理API，在海量数据查询中可以很好的解决内存问题，如:</p><p>　　while(it.hasNext()){</p><p>　　YouObject object = (YouObject)it.next();</p><p>　　session.evict(youObject);</p><p>　　sessionFactory.evice(YouObject.class, youObject.getId());</p><p>　　}</p><p>　　如果用list方法，很可能就出OutofMemory错误了。</p><p>　　iv. 通过上面的说明，我想你应该知道如何去使用这两个方法了。</p><p>　　7、 集合的选用</p><p>　　在HIBERNATE 3.1文档的“19.5. Understanding Collection performance”中有详细的说明。</p><p>　　8、 事务控制</p><p>　　事务方面对性能有影响的主要包括:事务方式的选用，事务隔离级别以及锁的选用</p><p>　　a) 事务方式选用:如果不涉及多个事务管理器事务的话，不需要使用JTA，只有JDBC的事务控制就可以。</p><p>　　b) 事务隔离级别:参见标准的SQL事务隔离级别</p><p>　　c) 锁的选用:悲观锁(一般由具体的事务管理器实现)，对于长事务效率低，但安全。乐观锁(一般在应用级别实现)，如在HIBERNATE中可以定义VERSION字段，显然，如果有多个应用操作数据，且这些应用不是用同一种乐观锁机制，则乐观锁会失效。因此，针对不同的数据应有不同的策略，同前面许多情况一样，很多时候我们是在效率与安全/准确性上找一个平衡点，无论如何，优化都不是一个纯技术的问题，你应该对你的应用和业务特征有足够的了解。</p><p>　　9、 批量操作</p><p>　　即使是使用JDBC，在进行大批数据更新时，BATCH与不使用BATCH有效率上也有很大的差别。我们可以通过设置batch_size来让其支持批量操作。</p><p>　　举个例子，要批量删除某表中的对象，如“delete Account”，打出来的语句，会发现HIBERNATE找出了所有ACCOUNT的ID，再进行删除，这主要是为了维护二级缓存，这样效率肯定高不了，在后续的版本中增加了bulk delete/update，但这也无法解决缓存的维护问题。也就是说，由于有了二级缓存的维护问题，HIBERNATE的批量操作效率并不尽如人意!</p><p>　　从前面许多要点可以看出，很多时候我们是在效率与安全/准确性上找一个平衡点，无论如何，优化都不是一个纯技术的问题，你应该对你的应用和业务特征有足够的了解，一般的，优化方案应在架构设计期就基本确定，否则可能导致没必要的返工，致使项目延期，而作为架构师和项目经理，还要面对开发人员可能的抱怨，必竟，我们对用户需求更改的控制力不大，但技术/架构风险是应该在初期意识到并制定好相关的对策。</p><p>　　还有一点要注意，应用层的缓存只是锦上添花，永远不要把它当救命稻草，应用的根基(数据库设计，算法，高效的操作语句，恰当API的选择等)才是最重要的。</p><img src ="http://www.blogjava.net/liaojiyong/aggbug/105725.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-03-23 09:48 <a href="http://www.blogjava.net/liaojiyong/archive/2007/03/23/105725.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate大数据量操作解决方案（轉）</title><link>http://www.blogjava.net/liaojiyong/archive/2007/01/12/93454.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 12 Jan 2007 07:30:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/01/12/93454.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/93454.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/01/12/93454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/93454.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/93454.html</trackback:ping><description><![CDATA[
		<div class="postTitle">
				<font size="4">阅读了Hibernate的Reference之后，可以采用批量处理的方法，当插入的数据超过10000时，就flush session并且clear。</font>
		</div>
		<div align="left">
				<font size="4">下面是一个测试method。<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: #008080"> 1</span><img id="Codehighlighter1_0_96_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_96_Open_Text.style.display='none'; Codehighlighter1_0_96_Closed_Image.style.display='inline'; Codehighlighter1_0_96_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_0_96_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_96_Closed_Text.style.display='none'; Codehighlighter1_0_96_Open_Image.style.display='inline'; Codehighlighter1_0_96_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span>/** */<span>/**<br /></span><span> 2<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * 测试成批插入数据的事务处理，返回是否成功<br /> 3<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * <br /></span><span style="COLOR: #008080"> 4</span><span><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * @param objPO Object<br /></span><span style="COLOR: #008080"> 5</span><span><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />     * @return boolean<br /></span><span style="COLOR: #008080"> 6</span><span style="COLOR: #008000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />     </span><span style="COLOR: #008000">*/</span></span><span><br /> 7<img id="Codehighlighter1_149_1523_Open_Image" onclick="this.style.display='none'; Codehighlighter1_149_1523_Open_Text.style.display='none'; Codehighlighter1_149_1523_Closed_Image.style.display='inline'; Codehighlighter1_149_1523_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_149_1523_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_149_1523_Closed_Text.style.display='none'; Codehighlighter1_149_1523_Open_Image.style.display='inline'; Codehighlighter1_149_1523_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> insertBatch(</span><span style="COLOR: #0000ff">final</span><span> Object objPO) <img src="http://www.blogjava.net/images/dot.gif" /><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> isSuccess </span><span style="COLOR: #000000">=</span><span> false;<br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Transaction transaction </span><span style="COLOR: #000000">=</span><span> null;<br /></span><span style="COLOR: #008080">10</span><span><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        Session session = openSession();<br /></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img id="Codehighlighter1_279_802_Open_Image" onclick="this.style.display='none'; Codehighlighter1_279_802_Open_Text.style.display='none'; Codehighlighter1_279_802_Closed_Image.style.display='inline'; Codehighlighter1_279_802_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_279_802_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_279_802_Closed_Text.style.display='none'; Codehighlighter1_279_802_Open_Image.style.display='inline'; Codehighlighter1_279_802_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">try</span><span> <img src="http://www.blogjava.net/images/dot.gif" /><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">12</span><span><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            transaction = session.beginTransaction();<br /></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img id="Codehighlighter1_380_625_Open_Image" onclick="this.style.display='none'; Codehighlighter1_380_625_Open_Text.style.display='none'; Codehighlighter1_380_625_Closed_Image.style.display='inline'; Codehighlighter1_380_625_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_380_625_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_380_625_Closed_Text.style.display='none'; Codehighlighter1_380_625_Open_Image.style.display='inline'; Codehighlighter1_380_625_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> i </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">; i </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">100000</span><span style="COLOR: #000000">; i</span><span style="COLOR: #000000">++</span><span>) <img src="http://www.blogjava.net/images/dot.gif" /><span>{<br />14<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                session.save(objPO);<br /></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img id="Codehighlighter1_452_611_Open_Image" onclick="this.style.display='none'; Codehighlighter1_452_611_Open_Text.style.display='none'; Codehighlighter1_452_611_Closed_Image.style.display='inline'; Codehighlighter1_452_611_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_452_611_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_452_611_Closed_Text.style.display='none'; Codehighlighter1_452_611_Open_Image.style.display='inline'; Codehighlighter1_452_611_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (i </span><span style="COLOR: #000000">%</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">50</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">0</span><span>) <img src="http://www.blogjava.net/images/dot.gif" /><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                    </span><span>// flush a batch of inserts and release memory<br />17</span><span><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                    session.flush();<br />18<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                    session.clear();<br /></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />                }</span></span><span><br />20</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span><br />21<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            transaction.commit();<br /></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            logger.info(</span><span style="COLOR: #000000">"</span><span>transaction.wasCommitted:"<br />23</span><span><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                    + transaction.wasCommitted());<br /></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            isSuccess </span><span style="COLOR: #000000">=</span><span> true;<br /></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img id="Codehighlighter1_834_1353_Open_Image" onclick="this.style.display='none'; Codehighlighter1_834_1353_Open_Text.style.display='none'; Codehighlighter1_834_1353_Closed_Image.style.display='inline'; Codehighlighter1_834_1353_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_834_1353_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_834_1353_Closed_Text.style.display='none'; Codehighlighter1_834_1353_Open_Image.style.display='inline'; Codehighlighter1_834_1353_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        }</span> catch</span><span> (HibernateException ex) <img src="http://www.blogjava.net/images/dot.gif" /><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img id="Codehighlighter1_873_1239_Open_Image" onclick="this.style.display='none'; Codehighlighter1_873_1239_Open_Text.style.display='none'; Codehighlighter1_873_1239_Closed_Image.style.display='inline'; Codehighlighter1_873_1239_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_873_1239_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_873_1239_Closed_Text.style.display='none'; Codehighlighter1_873_1239_Open_Image.style.display='inline'; Codehighlighter1_873_1239_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (transaction </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span>) <img src="http://www.blogjava.net/images/dot.gif" /><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img id="Codehighlighter1_895_1079_Open_Image" onclick="this.style.display='none'; Codehighlighter1_895_1079_Open_Text.style.display='none'; Codehighlighter1_895_1079_Closed_Image.style.display='inline'; Codehighlighter1_895_1079_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_895_1079_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_895_1079_Closed_Text.style.display='none'; Codehighlighter1_895_1079_Open_Image.style.display='inline'; Codehighlighter1_895_1079_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                </span><span style="COLOR: #0000ff">try</span><span> <img src="http://www.blogjava.net/images/dot.gif" /><span>{<br />28<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                    transaction.rollback();<br /></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                    logger.error(</span><span style="COLOR: #000000">"</span><span>transaction.wasRolledBack:"<br />30</span><span><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                            + transaction.wasRolledBack());<br /></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img id="Codehighlighter1_1112_1225_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1112_1225_Open_Text.style.display='none'; Codehighlighter1_1112_1225_Closed_Image.style.display='inline'; Codehighlighter1_1112_1225_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1112_1225_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1112_1225_Closed_Text.style.display='none'; Codehighlighter1_1112_1225_Open_Image.style.display='inline'; Codehighlighter1_1112_1225_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />                }</span> catch</span><span> (HibernateException ex1) <img src="http://www.blogjava.net/images/dot.gif" /><span style="COLOR: #000000">{<br /></span><span>32<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                    logger.error(ex1.getMessage());<br />33<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                    ex1.printStackTrace();<br /></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />                }</span></span><span><br />35</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span><br />36<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            logger.error(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Insert Batch PO Error:</span><span style="COLOR: #000000">"</span><span> + ex.getMessage());<br />37<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            ex.printStackTrace();<br /></span><span style="COLOR: #008080">38</span><span style="COLOR: #000000"><img id="Codehighlighter1_1363_1491_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1363_1491_Open_Text.style.display='none'; Codehighlighter1_1363_1491_Closed_Image.style.display='inline'; Codehighlighter1_1363_1491_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1363_1491_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1363_1491_Closed_Text.style.display='none'; Codehighlighter1_1363_1491_Open_Image.style.display='inline'; Codehighlighter1_1363_1491_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        }</span> finally</span><span> <img src="http://www.blogjava.net/images/dot.gif" /><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img id="Codehighlighter1_1402_1452_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1402_1452_Open_Text.style.display='none'; Codehighlighter1_1402_1452_Closed_Image.style.display='inline'; Codehighlighter1_1402_1452_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1402_1452_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1402_1452_Closed_Text.style.display='none'; Codehighlighter1_1402_1452_Open_Image.style.display='inline'; Codehighlighter1_1402_1452_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (transaction </span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span>) <img src="http://www.blogjava.net/images/dot.gif" /><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />                transaction </span><span style="COLOR: #000000">=</span><span> null;<br /></span><span style="COLOR: #008080">41</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span><br />42<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            session.close();<br /></span><span style="COLOR: #008080">43</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span><br />44</span><span><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        return isSuccess;<br /></span><span style="COLOR: #008080">45</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span><span><br />46</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div><br />这只是简单的测试，实际项目中遇到的问题，要比这个复杂得多。<br />这时候，我们可以让Spring来控制Transaction，自己来控制Hibernate的Session，随时更新数据。</font>
				<font size="2">
						<br />首先，利用HibernateDaoSupport类来自定义个方法打开Session；<br /></font>
				<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: #008080">1</span>
						<img id="Codehighlighter1_28_125_Open_Image" onclick="this.style.display='none'; Codehighlighter1_28_125_Open_Text.style.display='none'; Codehighlighter1_28_125_Closed_Image.style.display='inline'; Codehighlighter1_28_125_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_28_125_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_28_125_Closed_Text.style.display='none'; Codehighlighter1_28_125_Open_Image.style.display='inline'; Codehighlighter1_28_125_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
						<span style="COLOR: #0000ff">public</span>
						<span> Session openSession()<img src="http://www.blogjava.net/images/dot.gif" /><span>{<br />2<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /></span><span style="COLOR: #008080">3</span><span><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        return getHibernateTemplate().getSessionFactory().openSession();<br />4<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /></span><span style="COLOR: #008080">5</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />    }</span></span>
				</div>然后，用打开的Session处理你的数据；<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: #008080"> 1</span><img id="Codehighlighter1_43_282_Open_Image" onclick="this.style.display='none'; Codehighlighter1_43_282_Open_Text.style.display='none'; Codehighlighter1_43_282_Closed_Image.style.display='inline'; Codehighlighter1_43_282_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_43_282_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_43_282_Closed_Text.style.display='none'; Codehighlighter1_43_282_Open_Image.style.display='inline'; Codehighlighter1_43_282_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">protected</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span> doBusiness(Session session) <img src="http://www.blogjava.net/images/dot.gif" /><span>{<br /> 2<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /></span><span style="COLOR: #008080"> 3</span><span style="COLOR: #000000"><img id="Codehighlighter1_67_273_Open_Image" onclick="this.style.display='none'; Codehighlighter1_67_273_Open_Text.style.display='none'; Codehighlighter1_67_273_Closed_Image.style.display='inline'; Codehighlighter1_67_273_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_67_273_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_67_273_Closed_Text.style.display='none'; Codehighlighter1_67_273_Open_Image.style.display='inline'; Codehighlighter1_67_273_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (</span><span style="COLOR: #0000ff">true</span><span>) <img src="http://www.blogjava.net/images/dot.gif" /><span style="COLOR: #000000">{<br /></span><span style="COLOR: #008080"> 4</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span>//do your business with the opening session        <br /> 5</span><span><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            someMethod(session);<br /></span><span> 6<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            session.flush();<br /> 7<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            session.clear();<br /></span><span style="COLOR: #008080"> 8</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            logger.info(</span><span style="COLOR: #000000">"</span><span>good job!");            <br /></span><span style="COLOR: #008080"> 9</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>       <br />10</span><span style="COLOR: #000000"><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div></div>
		<p>每做一次数据操作，就更新一次Session，这样可以保证每次数据操作都成功，否则就让Spring去控制它roll back吧。<br /><br />最后，记得关闭Session。<br /></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: #008080">1</span>
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #000000">Session session </span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000"> openSession();<br /></span>
				<span style="COLOR: #008080">2</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />doBusiness(session);<br /></span>
				<span style="COLOR: #008080">3</span>
				<span style="COLOR: #000000">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />session.close(); </span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">关闭session</span>
		</div>
		<p>
				<br />至于处理速度呢，不会慢到哪儿去的，已经试验过了。; - )<br /><br />还等什么，赶快试试吧！<br /></p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/93454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-01-12 15:30 <a href="http://www.blogjava.net/liaojiyong/archive/2007/01/12/93454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 深入研究之Criteria(轉)</title><link>http://www.blogjava.net/liaojiyong/archive/2007/01/12/93427.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Fri, 12 Jan 2007 06:27:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2007/01/12/93427.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/93427.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2007/01/12/93427.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/93427.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/93427.html</trackback:ping><description><![CDATA[
		<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最近在项目中使用</span>
		<span lang="EN-US">Spring</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 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">Hibernate</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">Hibernate Reference</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">Criteria</span>
		<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的结构入手来进行分析。</span>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </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">1</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 lang="EN-US">CriteriaSpecification</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">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">DetachedCriteria</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 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">DetachedCriteria</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">Hibernate 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">DetachedCriteria</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是离线的，创建时无需</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">DetachedCriteria</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了</span>
				<span lang="EN-US">4</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个静态方法</span>
				<span lang="EN-US">forClass(Class)</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span>
				<span lang="EN-US">forEntityName(Name)</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行</span>
				<span lang="EN-US">DetachedCriteria</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实例的创建。</span>
				<span lang="EN-US">Spring</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">getHibernateTemplate().findByCriteria(detachedCriteria)</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">DetachedCriteria</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>
				<span lang="EN-US">1</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">DetachedCriteria</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">均可使用</span>
				<span lang="EN-US">Criterion</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">Projection</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置查询条件。可以设置</span>
				<span lang="EN-US">FetchMode(</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>
				<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">FlushModel</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（冲刷</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">LockMode</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>
				<span lang="EN-US">Criterion</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">Projection</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">       <img src="http://www.blogjava.net/images/blogjava_net/faith/13332/o_Criteria.JPG" /></span>
						<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /?>
						<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">
								<v:stroke joinstyle="miter">
								</v:stroke>
								<v:formulas>
										<v:f eqn="if lineDrawn pixelLineWidth 0">
										</v:f>
										<v:f eqn="sum @0 1 0">
										</v:f>
										<v:f eqn="sum 0 0 @1">
										</v:f>
										<v:f eqn="prod @2 1 2">
										</v:f>
										<v:f eqn="prod @3 21600 pixelWidth">
										</v:f>
										<v:f eqn="prod @3 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @0 0 1">
										</v:f>
										<v:f eqn="prod @6 1 2">
										</v:f>
										<v:f eqn="prod @7 21600 pixelWidth">
										</v:f>
										<v:f eqn="sum @8 21600 0">
										</v:f>
										<v:f eqn="prod @7 21600 pixelHeight">
										</v:f>
										<v:f eqn="sum @10 21600 0">
										</v:f>
								</v:formulas>
								<v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f">
								</v:path>
								<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
								<o:lock aspectratio="t" v:ext="edit">
								</o:lock>
						</v:shapetype>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图</span>
				<span lang="EN-US">1</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>Criterion</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>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<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">add(Criterion criterion)</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法来添加查询条件。图</span>
				<span lang="EN-US">2</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</span>
				<span lang="EN-US">Criterion</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的结构图。</span>
				<span lang="EN-US">Criterion</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'">、</span>
				<span lang="EN-US">Junction</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">SimpleExpression</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。而</span>
				<span lang="EN-US">Junction</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实际使用是它的两个子类</span>
				<span lang="EN-US">conjunction</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">disjunction</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>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">Criterion</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实例可以通过</span>
				<span lang="EN-US">Restrictions</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具类来创建，</span>
				<span lang="EN-US">Restrictions</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了大量的静态方法，如</span>
				<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">ge</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">Criterion</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">SimpleExpression</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实例）。除此之外，</span>
				<span lang="EN-US">Restrictions</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还提供了方法来创建</span>
				<span lang="EN-US">conjunction</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">disjunction</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实例，通过往该实例的</span>
				<span lang="EN-US">add(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; 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">Example</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'">本身提供了一个静态方法</span>
				<span lang="EN-US">create(Object entity)</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 lang="EN-US">Example exampleUser =Example.create(u)</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 126pt">
				<span lang="EN-US">.ignoreCase() //</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 105pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">.enableLike(MatchMode.ANYWHERE);</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 105pt">
				<span lang="EN-US">//</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对</span>
				<span lang="EN-US">String</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类型的属性，无论在那里值在那里都匹配。相当于</span>
				<span lang="EN-US">%value%</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
						<img src="http://www.blogjava.net/images/blogjava_net/faith/13332/o_Criterion.JPG" />
						<br />图</span>
				<span lang="EN-US">2</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
				<span lang="EN-US">Project </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">Project</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主要有</span>
				<span lang="EN-US">SimpleProjection</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
				<span lang="EN-US">ProjectionList</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">Property</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">三个实现。其中</span>
				<span lang="EN-US">SimpleProjection</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
				<span lang="EN-US">ProjectionList</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实例化是由内建的</span>
				<span lang="EN-US">Projections</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来完成，如提供的</span>
				<span lang="EN-US">avg</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
				<span lang="EN-US">count</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
				<span lang="EN-US">max</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
				<span lang="EN-US">min</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
				<span lang="EN-US">sum</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">       </span>Property</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">      </span>Porperty.forName(“color”).in(new String[]{“black”,”red”,”write”});</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则可以创建一个</span>
				<span lang="EN-US">Project</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">add(Project)</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>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
						<img src="http://www.blogjava.net/images/blogjava_net/faith/13332/o_Projection.JPG" />
						<br />图</span>
				<span lang="EN-US">3</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </span>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
				<span lang="EN-US">
						<span style="mso-tab-count: 1">       </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">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">Hibernate</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了那些类和方法来满足开发中查询条件的创建和组装，其结构层次如何。这样使用起来便可得心应手。</span>
		</p>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/93427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2007-01-12 14:27 <a href="http://www.blogjava.net/liaojiyong/archive/2007/01/12/93427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 深入研究之 Criteria （转）</title><link>http://www.blogjava.net/liaojiyong/archive/2006/07/24/59843.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Mon, 24 Jul 2006 08:23:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2006/07/24/59843.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/59843.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2006/07/24/59843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/59843.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/59843.html</trackback:ping><description><![CDATA[
		<div class="postbody">
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
						<span lang="EN-US">
								<span style="mso-tab-count: 1">       </span>
						</span>
				</p>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最近在项目中使用</span>
				<span lang="EN-US">Spring</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 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">Hibernate</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">Hibernate Reference</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">Criteria</span>
				<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的结构入手来进行分析。</span>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 1">       </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">1</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 lang="EN-US">CriteriaSpecification</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">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">DetachedCriteria</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 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">DetachedCriteria</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">Hibernate 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">DetachedCriteria</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是离线的，创建时无需</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">DetachedCriteria</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了</span>
						<span lang="EN-US">4</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">个静态方法</span>
						<span lang="EN-US">forClass(Class)</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</span>
						<span lang="EN-US">forEntityName(Name)</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">进行</span>
						<span lang="EN-US">DetachedCriteria</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实例的创建。</span>
						<span lang="EN-US">Spring</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">getHibernateTemplate().findByCriteria(detachedCriteria)</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">DetachedCriteria</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>
						<span lang="EN-US">1</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">DetachedCriteria</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">均可使用</span>
						<span lang="EN-US">Criterion</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
						<span lang="EN-US">Projection</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置查询条件。可以设置</span>
						<span lang="EN-US">FetchMode(</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>
						<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">FlushModel</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">（冲刷</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">LockMode</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>
						<span lang="EN-US">Criterion</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
						<span lang="EN-US">Projection</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">       <img src="http://www.blogjava.net/images/blogjava_net/faith/13332/o_Criteria.JPG" /></span>
								<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /?>
								<v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
										<v:stroke joinstyle="miter">
										</v:stroke>
										<v:formulas>
												<v:f eqn="if lineDrawn pixelLineWidth 0">
												</v:f>
												<v:f eqn="sum @0 1 0">
												</v:f>
												<v:f eqn="sum 0 0 @1">
												</v:f>
												<v:f eqn="prod @2 1 2">
												</v:f>
												<v:f eqn="prod @3 21600 pixelWidth">
												</v:f>
												<v:f eqn="prod @3 21600 pixelHeight">
												</v:f>
												<v:f eqn="sum @0 0 1">
												</v:f>
												<v:f eqn="prod @6 1 2">
												</v:f>
												<v:f eqn="prod @7 21600 pixelWidth">
												</v:f>
												<v:f eqn="sum @8 21600 0">
												</v:f>
												<v:f eqn="prod @7 21600 pixelHeight">
												</v:f>
												<v:f eqn="sum @10 21600 0">
												</v:f>
										</v:formulas>
										<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect">
										</v:path>
										<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>
										<o:lock v:ext="edit" aspectratio="t">
										</o:lock>
								</v:shapetype>
						</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">图</span>
						<span lang="EN-US">1</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<o:p> </o:p>
						</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 1">       </span>Criterion</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>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
						<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">add(Criterion criterion)</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法来添加查询条件。图</span>
						<span lang="EN-US">2</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是</span>
						<span lang="EN-US">Criterion</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的结构图。</span>
						<span lang="EN-US">Criterion</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'">、</span>
						<span lang="EN-US">Junction</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
						<span lang="EN-US">SimpleExpression</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。而</span>
						<span lang="EN-US">Junction</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实际使用是它的两个子类</span>
						<span lang="EN-US">conjunction</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
						<span lang="EN-US">disjunction</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>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
						<span lang="EN-US">Criterion</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实例可以通过</span>
						<span lang="EN-US">Restrictions</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">工具类来创建，</span>
						<span lang="EN-US">Restrictions</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了大量的静态方法，如</span>
						<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">ge</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">Criterion</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">SimpleExpression</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实例）。除此之外，</span>
						<span lang="EN-US">Restrictions</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还提供了方法来创建</span>
						<span lang="EN-US">conjunction</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
						<span lang="EN-US">disjunction</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实例，通过往该实例的</span>
						<span lang="EN-US">add(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; 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">Example</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'">本身提供了一个静态方法</span>
						<span lang="EN-US">create(Object entity)</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 lang="EN-US">Example exampleUser =Example.create(u)</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 126pt">
						<span lang="EN-US">.ignoreCase() //</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 105pt; TEXT-INDENT: 21pt">
						<span lang="EN-US">.enableLike(MatchMode.ANYWHERE);</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt 105pt">
						<span lang="EN-US">//</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">对</span>
						<span lang="EN-US">String</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类型的属性，无论在那里值在那里都匹配。相当于</span>
						<span lang="EN-US">%value%</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
						</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
								<img src="http://www.blogjava.net/images/blogjava_net/faith/13332/o_Criterion.JPG" />
								<br />图</span>
						<span lang="EN-US">2</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 1">       </span>
						</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt">
						<span lang="EN-US">Project </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">Project</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">主要有</span>
						<span lang="EN-US">SimpleProjection</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
						<span lang="EN-US">ProjectionList</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
						<span lang="EN-US">Property</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">三个实现。其中</span>
						<span lang="EN-US">SimpleProjection</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span>
						<span lang="EN-US">ProjectionList</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的实例化是由内建的</span>
						<span lang="EN-US">Projections</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来完成，如提供的</span>
						<span lang="EN-US">avg</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
						<span lang="EN-US">count</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
						<span lang="EN-US">max</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
						<span lang="EN-US">min</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</span>
						<span lang="EN-US">sum</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">       </span>Property</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">      </span>Porperty.forName(“color”).in(new String[]{“black”,”red”,”write”});</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则可以创建一个</span>
						<span lang="EN-US">Project</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">add(Project)</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>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center">
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">
								<img src="http://www.blogjava.net/images/blogjava_net/faith/13332/o_Projection.JPG" />
								<br />图</span>
						<span lang="EN-US">3</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 1">       </span>
						</span>
				</p>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt">
						<span lang="EN-US">
								<span style="mso-tab-count: 1">       </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">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">Hibernate</span>
						<span style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">提供了那些类和方法来满足开发中查询条件的创建和组装，其结构层次如何。这样使用起来便可得心应手。</span>
				</p>
		</div>
<img src ="http://www.blogjava.net/liaojiyong/aggbug/59843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2006-07-24 16:23 <a href="http://www.blogjava.net/liaojiyong/archive/2006/07/24/59843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>以2/8原则指导我们的底层框架设计 （转）</title><link>http://www.blogjava.net/liaojiyong/archive/2006/07/21/59314.html</link><dc:creator>liaojiyong</dc:creator><author>liaojiyong</author><pubDate>Thu, 20 Jul 2006 17:35:00 GMT</pubDate><guid>http://www.blogjava.net/liaojiyong/archive/2006/07/21/59314.html</guid><wfw:comment>http://www.blogjava.net/liaojiyong/comments/59314.html</wfw:comment><comments>http://www.blogjava.net/liaojiyong/archive/2006/07/21/59314.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liaojiyong/comments/commentRss/59314.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liaojiyong/services/trackbacks/59314.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原创文章，转载请注明作者：Nomad，出处：						www.jialing.net		     我想很多人都听说过“2/8”原则，有人研究过，这世界上财富的80％集中在20％的人手里，而另外80％的人只拥用20％的财富。实际的商业中，我们应该更关注大客户，因为客户里20％的大客户，对我们贡献的利润可能会占到80％，这些都是有统计学基础的数据。    在应用软件的研发中同样遵守这个原...&nbsp;&nbsp;<a href='http://www.blogjava.net/liaojiyong/archive/2006/07/21/59314.html'>阅读全文</a><img src ="http://www.blogjava.net/liaojiyong/aggbug/59314.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liaojiyong/" target="_blank">liaojiyong</a> 2006-07-21 01:35 <a href="http://www.blogjava.net/liaojiyong/archive/2006/07/21/59314.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>