﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-豪情-随笔分类-Hibernate 3</title><link>http://www.blogjava.net/jikey/category/45259.html</link><description>JAVA交流：38611691</description><language>zh-cn</language><lastBuildDate>Sat, 12 Jun 2010 08:46:44 GMT</lastBuildDate><pubDate>Sat, 12 Jun 2010 08:46:44 GMT</pubDate><ttl>60</ttl><item><title>hibernate中lazy的使用 </title><link>http://www.blogjava.net/jikey/archive/2010/06/10/323256.html</link><dc:creator>豪情</dc:creator><author>豪情</author><pubDate>Thu, 10 Jun 2010 09:47:00 GMT</pubDate><guid>http://www.blogjava.net/jikey/archive/2010/06/10/323256.html</guid><wfw:comment>http://www.blogjava.net/jikey/comments/323256.html</wfw:comment><comments>http://www.blogjava.net/jikey/archive/2010/06/10/323256.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jikey/comments/commentRss/323256.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jikey/services/trackbacks/323256.html</trackback:ping><description><![CDATA[来自于：http://www.cnblogs.com/linbaoji/archive/2009/01/07/1370919.html<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;"><br />
<br />
lazy，延迟加载<br />
<br />
Lazy的有效期：只有在session打开的时候才有效；session关闭后lazy就没效了。<br />
<br />
lazy策略可以用在：<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">class</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">标签上：可以取值true</span><span style="color: #808080;">/</span><span style="color: #000000;">false<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">property</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">标签上，可以取值true</span><span style="color: #808080;">/</span><span style="color: #000000;">false，这个特性需要类增强<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">&lt;</span><span style="color: #0000ff;">set</span><span style="color: #808080;">&gt;/&lt;</span><span style="color: #000000;">list</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">等集合上，可以取值为true</span><span style="color: #808080;">/</span><span style="color: #000000;">false</span><span style="color: #808080;">/</span><span style="color: #000000;">extra<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">one</span><span style="color: #808080;">-</span><span style="color: #0000ff;">to</span><span style="color: #808080;">-</span><span style="color: #000000;">one</span><span style="color: #808080;">&gt;/&lt;</span><span style="color: #000000;">many</span><span style="color: #808080;">-</span><span style="color: #0000ff;">to</span><span style="color: #808080;">-</span><span style="color: #000000;">one</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">等标签上，可以取值false</span><span style="color: #808080;">/</span><span style="color: #000000;">proxy</span><span style="color: #808080;">/</span><span style="color: #000000;">no</span><span style="color: #808080;">-</span><span style="color: #000000;">proxy<br />
<br />
</span><span style="color: #800000; font-weight: bold;">6.1</span><span style="color: #000000;">&nbsp;get和load的区别：<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;get不支持延迟加载，而load支持。<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;当查询特定的数据库中不存在的数据时，get会返回null，而load则抛出异常。<br />
<br />
</span><span style="color: #800000; font-weight: bold;">6.2</span><span style="color: #000000;">&nbsp;类(Class)的延迟加载：<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;设置</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">class</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">标签中的lazy</span><span style="color: #808080;">=</span><span style="color: #000000;">"true",或是保持默认（即不配置lazy属性)<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;如果lazy的属性值为true，那么在使用load方法加载数据时，只有确实用到数据的时候才会发出sql语句；这样有可能减少系统的开销。<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">//</span><span style="color: #000000;">不会发出查询sql<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("</span><span style="color: #0000ff;">group</span><span style="color: #000000;">&nbsp;id</span><span style="color: #808080;">=</span><span style="color: #000000;">"&nbsp;</span><span style="color: #808080;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">group</span><span style="color: #000000;">.getId());<br />
<br />
这里有一个问题，为什么加载主键的时候不需要发出sql语句。<br />
<br />
</span><span style="color: #800000; font-weight: bold;">6.3</span><span style="color: #000000;">&nbsp;集合(collection)的延迟加载：可以取值true，false，extra<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;保持集合上的lazy的默认值，此时的效果和lazy</span><span style="color: #808080;">=</span><span style="color: #000000;">"extra"是基本一样的。<br />
<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;设置集合上的lazy</span><span style="color: #808080;">=</span><span style="color: #000000;">extra,此时的效果和lazy属性的默认值是基本一样的。但是推荐使用这个属性值，因为在统计时这种情况显得比较智能。当然延迟是有效果的。<br />
<br />
</span><span style="color: #808080;">*</span><span style="color: #000000;">&nbsp;设置集合上的lazy</span><span style="color: #808080;">=</span><span style="color: #000000;">false<br />
<br />
true:默认取值，它的意思是只有在调用这个集合获取里面的元素对象时，才发出查询语句，加载其集合元素的数据<br />
<br />
false:取消懒加载特性，即在加载对象的同时，就发出第二条查询语句加载其关联集合的数据<br />
<br />
extra:一种比较聪明的懒加载策略，即调用集合的size</span><span style="color: #808080;">/</span><span style="color: #000000;">contains等方法的时候，hibernate<br />
<br />
并不会去加载整个集合的数据，而是发出一条聪明的SQL语句，以便获得需要的值，只有在真正需要用到这些集合元素对象数据的时候，才去发出查询语句加载所有对象的数据<br />
<br />
</span><span style="color: #800000; font-weight: bold;">6.4</span><span style="color: #000000;">&nbsp;Hibernate单端关联懒加载策略：即在</span><span style="color: #808080;">&lt;</span><span style="color: #000000;">one</span><span style="color: #808080;">-</span><span style="color: #0000ff;">to</span><span style="color: #808080;">-</span><span style="color: #000000;">one</span><span style="color: #808080;">&gt;/&lt;</span><span style="color: #000000;">many</span><span style="color: #808080;">-</span><span style="color: #0000ff;">to</span><span style="color: #808080;">-</span><span style="color: #000000;">one</span><span style="color: #808080;">&gt;</span><span style="color: #000000;">标签上可以配置<br />
<br />
懒加载策略。可以取值为：false</span><span style="color: #808080;">/</span><span style="color: #000000;">proxy</span><span style="color: #808080;">/</span><span style="color: #000000;">no</span><span style="color: #808080;">-</span><span style="color: #000000;">proxy<br />
<br />
false:取消懒加载策略，即在加载对象的同时，发出查询语句，加载其关联对象<br />
<br />
proxy:这是hibernate对单端关联的默认懒加载策略，即只有在调用到其关联对象的方法的时候才真正发出查询语句查询其对象数据，其关联对象是代理类<br />
<br />
no</span><span style="color: #808080;">-</span><span style="color: #000000;">proxy:这种懒加载特性需要对类进行增强，使用no</span><span style="color: #808080;">-</span><span style="color: #000000;">proxy，其关联对象不是代理类<br />
<br />
注意：在class标签上配置的lazy属性不会影响到关联对象!!!<br />
</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/jikey/aggbug/323256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jikey/" target="_blank">豪情</a> 2010-06-10 17:47 <a href="http://www.blogjava.net/jikey/archive/2010/06/10/323256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中Criteria的完整用法 </title><link>http://www.blogjava.net/jikey/archive/2010/06/10/323254.html</link><dc:creator>豪情</dc:creator><author>豪情</author><pubDate>Thu, 10 Jun 2010 09:44:00 GMT</pubDate><guid>http://www.blogjava.net/jikey/archive/2010/06/10/323254.html</guid><wfw:comment>http://www.blogjava.net/jikey/comments/323254.html</wfw:comment><comments>http://www.blogjava.net/jikey/archive/2010/06/10/323254.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jikey/comments/commentRss/323254.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jikey/services/trackbacks/323254.html</trackback:ping><description><![CDATA[源自于：http://www.blogjava.net/lifenote/archive/2008/03/12/185708.html<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">最近在项目中使用&nbsp;Spring&nbsp;和&nbsp;Hibernate&nbsp;进行开发，有感于&nbsp;Criteria&nbsp;比较好用，在查询方法<br />
<br />
设计上可以灵活的根据&nbsp;Criteria&nbsp;的特点来方便地进行查询条件的组装。现在对&nbsp;Hibernate的Criteria&nbsp;的用法进行总结：<br />
&nbsp;&nbsp;&nbsp;Hibernate&nbsp;设计了&nbsp;CriteriaSpecification&nbsp;作为&nbsp;Criteria&nbsp;的父接口，下面提供了&nbsp;Criteria和DetachedCriteria&nbsp;。<br />
&nbsp;&nbsp;&nbsp;Criteria&nbsp;和&nbsp;DetachedCriteria&nbsp;的主要区别在于创建的形式不一样，&nbsp;Criteria&nbsp;是在线的，所<br />
以它是由&nbsp;Hibernate&nbsp;Session&nbsp;进行创建的；而&nbsp;DetachedCriteria&nbsp;是离线的，创建时无需<br />
Session，DetachedCriteria&nbsp;提供了&nbsp;</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">&nbsp;个静态方法&nbsp;forClass(Class)&nbsp;或&nbsp;forEntityName(Name)<br />
进行DetachedCriteria&nbsp;实例的创建。&nbsp;Spring&nbsp;的框架提供了getHibernateTemplate<br />
().findByCriteria(detachedCriteria)&nbsp;方法可以很方便地根据DetachedCriteria&nbsp;来返回查询结<br />
果。<br />
&nbsp;&nbsp;&nbsp;Criteria&nbsp;和&nbsp;DetachedCriteria&nbsp;均可使用&nbsp;Criterion&nbsp;和&nbsp;Projection&nbsp;设置查询条件。可以设<br />
置&nbsp;FetchMode(&nbsp;联合查询抓取的模式&nbsp;)&nbsp;，设置排序方式。对于&nbsp;Criteria&nbsp;还可以设置&nbsp;FlushModel<br />
（冲刷&nbsp;Session&nbsp;的方式）和&nbsp;LockMode&nbsp;（数据库锁模式）。<br />
下面对&nbsp;Criterion&nbsp;和&nbsp;Projection&nbsp;进行详细说明。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Criterion&nbsp;是&nbsp;Criteria&nbsp;的查询条件。Criteria&nbsp;提供了&nbsp;</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(Criterion&nbsp;criterion)&nbsp;方法来<br />
添加查询条件。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Criterion&nbsp;接口的主要实现包括：&nbsp;Example&nbsp;、&nbsp;Junction&nbsp;和&nbsp;SimpleExpression&nbsp;。而<br />
Junction&nbsp;的实际使用是它的两个子类&nbsp;conjunction&nbsp;和&nbsp;disjunction&nbsp;，分别是使用&nbsp;</span><span style="color: #808080;">AND</span><span style="color: #000000;">&nbsp;和&nbsp;</span><span style="color: #808080;">OR</span><span style="color: #000000;">&nbsp;操<br />
作符进行来联结查询条件集合。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Criterion&nbsp;的实例可以通过&nbsp;Restrictions&nbsp;工具类来创建，Restrictions&nbsp;提供了大量的静态<br />
方法，如&nbsp;eq&nbsp;（等于）、&nbsp;ge&nbsp;（大于等于）、&nbsp;</span><span style="color: #808080;">between</span><span style="color: #000000;">&nbsp;等来方法的创建&nbsp;Criterion&nbsp;查询条件<br />
（SimpleExpression&nbsp;实例）。除此之外，&nbsp;Restrictions&nbsp;还提供了方法来创建&nbsp;conjunction&nbsp;和<br />
disjunction&nbsp;实例，通过往该实例的&nbsp;</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(Criteria)&nbsp;方法来增加查询条件形成一个查询条件集合<br />
。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;至于&nbsp;Example&nbsp;的创建有所不同，&nbsp;Example&nbsp;本身提供了一个静态方法&nbsp;</span><span style="color: #0000ff;">create</span><span style="color: #000000;">(Object<br />
entity)&nbsp;，即根据一个对象（实际使用中一般是映射到数据库的对象）来创建。然后可以设置一些<br />
过滤条件：<br />
Example&nbsp;exampleUser&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">Example.</span><span style="color: #0000ff;">create</span><span style="color: #000000;">(u)<br />
.ignoreCase()&nbsp;</span><span style="color: #808080;">//</span><span style="color: #000000;">&nbsp;忽略大小写<br />
.enableLike(MatchMode.ANYWHERE);<br />
</span><span style="color: #808080;">//</span><span style="color: #000000;">&nbsp;对&nbsp;String&nbsp;类型的属性，无论在那里值在那里都匹配。相当于&nbsp;</span><span style="color: #808080;">%</span><span style="color: #000000;">value</span><span style="color: #808080;">%</span><span style="color: #000000;"><br />
&nbsp;&nbsp;Project&nbsp;主要是让&nbsp;Criteria&nbsp;能够进行报表查询，并可以实现分组。&nbsp;Project&nbsp;主要有<br />
SimpleProjection&nbsp;、&nbsp;ProjectionList&nbsp;和&nbsp;Property&nbsp;三个实现。其中&nbsp;SimpleProjection&nbsp;和<br />
ProjectionList&nbsp;的实例化是由内建的&nbsp;Projections&nbsp;来完成，如提供的&nbsp;</span><span style="color: #ff00ff;">avg</span><span style="color: #000000;">&nbsp;、&nbsp;</span><span style="color: #ff00ff;">count</span><span style="color: #000000;">&nbsp;、&nbsp;</span><span style="color: #ff00ff;">max</span><span style="color: #000000;">&nbsp;、<br />
</span><span style="color: #ff00ff;">min</span><span style="color: #000000;">&nbsp;、&nbsp;</span><span style="color: #ff00ff;">sum</span><span style="color: #000000;">&nbsp;可以让开发者很容易对某个字段进行统计查询。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Property&nbsp;是对某个字段进行查询条件的设置，如通过Porperty.forName(&#8220;color&#8221;).</span><span style="color: #808080;">in</span><span style="color: #000000;"><br />
(new&nbsp;String</span><span style="color: #ff0000;">[]</span><span style="color: #000000;">{&#8220;black&#8221;,&#8221;red&#8221;,&#8221;write&#8221;});&nbsp;则可以创建一个&nbsp;Project&nbsp;实例。通过<br />
criteria&nbsp;的&nbsp;</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(Project)&nbsp;方法加入到查询条件中去。<br />
&nbsp;&nbsp;&nbsp;&nbsp;使用&nbsp;Criteria&nbsp;进行查询，主要要清晰的是&nbsp;Hibernate&nbsp;提供了那些类和方法来满足开发中查<br />
询条件的创建和组装，下面介绍几种用法：<br />
</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">.&nbsp;创建一个Criteria&nbsp;实例<br />
org.hibernate.Criteria接口表示特定持久类的一个查询。Session是&nbsp;Criteria实例的工厂。<br />
Criteria&nbsp;crit&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class);<br />
crit.setMaxResults(</span><span style="color: #800000; font-weight: bold;">50</span><span style="color: #000000;">);<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;crit.list();<br />
&nbsp;<br />
</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">.&nbsp;限制结果集内容<br />
一个单独的查询条件是org.hibernate.criterion.Criterion&nbsp;接口的一个实例。<br />
<br />
org.hibernate.criterion.Restrictions类&nbsp;定义了获得某些内置Criterion类型的工厂方法。<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #808080;">like</span><span style="color: #000000;">("name",&nbsp;"Fritz</span><span style="color: #808080;">%</span><span style="color: #000000;">")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #808080;">between</span><span style="color: #000000;">("weight",&nbsp;minWeight,&nbsp;maxWeight)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
约束可以按逻辑分组。<br />
&nbsp;<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #808080;">like</span><span style="color: #000000;">("name",&nbsp;"Fritz</span><span style="color: #808080;">%</span><span style="color: #000000;">")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #808080;">or</span><span style="color: #000000;">(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Restrictions.eq(&nbsp;"age",&nbsp;new&nbsp;</span><span style="color: #000000; font-weight: bold;">Integer</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;">)&nbsp;),<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Restrictions.</span><span style="color: #ff00ff;">isNull</span><span style="color: #000000;">("age")<br />
&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
&nbsp;<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #808080;">in</span><span style="color: #000000;">(&nbsp;"name",&nbsp;new&nbsp;String</span><span style="color: #ff0000;">[]</span><span style="color: #000000;">&nbsp;{&nbsp;"Fritz",&nbsp;"Izi",&nbsp;"Pk"&nbsp;}&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.disjunction()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #ff00ff;">isNull</span><span style="color: #000000;">("age")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.eq("age",&nbsp;new&nbsp;</span><span style="color: #000000; font-weight: bold;">Integer</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;">)&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.eq("age",&nbsp;new&nbsp;</span><span style="color: #000000; font-weight: bold;">Integer</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">)&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.eq("age",&nbsp;new&nbsp;</span><span style="color: #000000; font-weight: bold;">Integer</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">)&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
&nbsp;<br />
Hibernate提供了相当多的内置criterion类型(Restrictions&nbsp;子类),&nbsp;但是尤其有用的是可以允许<br />
<br />
你直接使用SQL。<br />
&nbsp;<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.sql("</span><span style="color: #ff00ff;">lower</span><span style="color: #000000;">({alias}.name)&nbsp;</span><span style="color: #808080;">like</span><span style="color: #000000;">&nbsp;</span><span style="color: #ff00ff;">lower</span><span style="color: #000000;">(?)",&nbsp;"Fritz</span><span style="color: #808080;">%</span><span style="color: #000000;">",<br />
<br />
Hibernate.STRING)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
&nbsp;<br />
{alias}占位符应当被替换为被查询实体的列别名。<br />
Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName()&nbsp;创建一个<br />
<br />
Property。<br />
&nbsp;<br />
&nbsp;&nbsp;Property&nbsp;age&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;Property.forName("age");<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.disjunction()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;age.</span><span style="color: #ff00ff;">isNull</span><span style="color: #000000;">()&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;age.eq(&nbsp;new&nbsp;</span><span style="color: #000000; font-weight: bold;">Integer</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">0</span><span style="color: #000000;">)&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;age.eq(&nbsp;new&nbsp;</span><span style="color: #000000; font-weight: bold;">Integer</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">1</span><span style="color: #000000;">)&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;age.eq(&nbsp;new&nbsp;</span><span style="color: #000000; font-weight: bold;">Integer</span><span style="color: #000000;">(</span><span style="color: #800000; font-weight: bold;">2</span><span style="color: #000000;">)&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("name").</span><span style="color: #808080;">in</span><span style="color: #000000;">(&nbsp;new&nbsp;String</span><span style="color: #ff0000;">[]</span><span style="color: #000000;">&nbsp;{&nbsp;"Fritz",&nbsp;"Izi",&nbsp;"Pk"&nbsp;}&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
&nbsp;<br />
</span><span style="color: #800000; font-weight: bold;">3</span><span style="color: #000000;">.&nbsp;结果集排序<br />
你可以使用org.hibernate.criterion.Order来为查询结果排序。<br />
&nbsp;<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #808080;">like</span><span style="color: #000000;">("name",&nbsp;"F</span><span style="color: #808080;">%</span><span style="color: #000000;">")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">asc</span><span style="color: #000000;">("name")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">desc</span><span style="color: #000000;">("age")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setMaxResults(</span><span style="color: #800000; font-weight: bold;">50</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
&nbsp;<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("name").</span><span style="color: #808080;">like</span><span style="color: #000000;">("F</span><span style="color: #808080;">%</span><span style="color: #000000;">")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Property.forName("name").</span><span style="color: #0000ff;">asc</span><span style="color: #000000;">()&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Property.forName("age").</span><span style="color: #0000ff;">desc</span><span style="color: #000000;">()&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setMaxResults(</span><span style="color: #800000; font-weight: bold;">50</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
&nbsp;<br />
</span><span style="color: #800000; font-weight: bold;">4</span><span style="color: #000000;">.&nbsp;关联<br />
你可以使用createCriteria()非常容易的在互相关联的实体间建立&nbsp;约束。<br />
&nbsp;<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #808080;">like</span><span style="color: #000000;">("name",&nbsp;"F</span><span style="color: #808080;">%</span><span style="color: #000000;">")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria("kittens")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #808080;">like</span><span style="color: #000000;">("name",&nbsp;"F</span><span style="color: #808080;">%</span><span style="color: #000000;">")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
注意第二个&nbsp;createCriteria()返回一个新的&nbsp;Criteria实例，该实例引用kittens&nbsp;集合中的元素。<br />
接下来，替换形态在某些情况下也是很有用的。<br />
&nbsp;<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.createAlias("kittens",&nbsp;"kt")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.createAlias("mate",&nbsp;"mt")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.eqProperty("kt.name",&nbsp;"mt.name")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
(createAlias()并不创建一个新的&nbsp;Criteria实例。)<br />
Cat实例所保存的之前两次查询所返回的kittens集合是&nbsp;没有被条件预过滤的。如果你希望只获得<br />
<br />
符合条件的kittens，&nbsp;你必须使用returnMaps()。<br />
&nbsp;<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria("kittens",&nbsp;"kt")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.eq("name",&nbsp;"F</span><span style="color: #808080;">%</span><span style="color: #000000;">")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.returnMaps()<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
Iterator&nbsp;iter&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;cats.iterator();<br />
</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(&nbsp;iter.hasNext()&nbsp;)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;map&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;(Map)&nbsp;iter.</span><span style="color: #0000ff;">next</span><span style="color: #000000;">();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Cat&nbsp;cat&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;(Cat)&nbsp;map.get(Criteria.ROOT_ALIAS);<br />
&nbsp;&nbsp;&nbsp;&nbsp;Cat&nbsp;kitten&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;(Cat)&nbsp;map.get("kt");<br />
}<br />
<br />
</span><span style="color: #800000; font-weight: bold;">5</span><span style="color: #000000;">.&nbsp;动态关联抓取<br />
你可以使用setFetchMode()在运行时定义动态关联抓取的语义。<br />
&nbsp;<br />
List&nbsp;cats&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.</span><span style="color: #808080;">like</span><span style="color: #000000;">("name",&nbsp;"Fritz</span><span style="color: #808080;">%</span><span style="color: #000000;">")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setFetchMode("mate",&nbsp;FetchMode.EAGER)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setFetchMode("kittens",&nbsp;FetchMode.EAGER)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
&nbsp;<br />
这个查询可以通过外连接抓取mate和kittens。<br />
&nbsp;<br />
</span><span style="color: #800000; font-weight: bold;">6</span><span style="color: #000000;">.&nbsp;查询示例<br />
org.hibernate.criterion.Example类允许你通过一个给定实例&nbsp;构建一个条件查询。<br />
&nbsp;<br />
Cat&nbsp;cat&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;new&nbsp;Cat();<br />
cat.setSex(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">F</span><span style="color: #ff0000;">'</span><span style="color: #000000;">);<br />
cat.setColor(Color.BLACK);<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Example.</span><span style="color: #0000ff;">create</span><span style="color: #000000;">(cat)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。<br />
可以自行调整Example使之更实用。<br />
&nbsp;<br />
Example&nbsp;example&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;Example.</span><span style="color: #0000ff;">create</span><span style="color: #000000;">(cat)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.excludeZeroes()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//</span><span style="color: #000000;">exclude&nbsp;zero&nbsp;valued&nbsp;properties<br />
&nbsp;&nbsp;&nbsp;&nbsp;.excludeProperty("color")&nbsp;&nbsp;</span><span style="color: #808080;">//</span><span style="color: #000000;">exclude&nbsp;the&nbsp;property&nbsp;named&nbsp;"color"<br />
&nbsp;&nbsp;&nbsp;&nbsp;.ignoreCase()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//</span><span style="color: #000000;">perform&nbsp;</span><span style="color: #ff00ff;">case</span><span style="color: #000000;">&nbsp;insensitive&nbsp;string&nbsp;comparisons<br />
&nbsp;&nbsp;&nbsp;&nbsp;.enableLike();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080;">//</span><span style="color: #0000ff;">use</span><span style="color: #000000;">&nbsp;</span><span style="color: #808080;">like</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;string&nbsp;comparisons<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(example)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
甚至可以使用examples在关联对象上放置条件。<br />
&nbsp;<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Example.</span><span style="color: #0000ff;">create</span><span style="color: #000000;">(cat)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria("mate")<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Example.</span><span style="color: #0000ff;">create</span><span style="color: #000000;">(&nbsp;cat.getMate()&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
</span><span style="color: #800000; font-weight: bold;">7</span><span style="color: #000000;">.&nbsp;投影(Projections)、聚合（aggregation）和分组（</span><span style="color: #ff00ff;">grouping</span><span style="color: #000000;">）<br />
org.hibernate.criterion.Projections是&nbsp;Projection&nbsp;的实例工厂。我们通过调用<br />
<br />
setProjection()应用投影到一个查询。<br />
&nbsp;<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.</span><span style="color: #0000ff;">rowCount</span><span style="color: #000000;">()&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Restrictions.eq("color",&nbsp;Color.BLACK)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
&nbsp;<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.projectionList()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.</span><span style="color: #0000ff;">rowCount</span><span style="color: #000000;">()&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.</span><span style="color: #ff00ff;">avg</span><span style="color: #000000;">("weight")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.</span><span style="color: #ff00ff;">max</span><span style="color: #000000;">("weight")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.groupProperty("color")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
<br />
在一个条件查询中没有必要显式的使用&nbsp;"</span><span style="color: #0000ff;">group</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">by</span><span style="color: #000000;">"&nbsp;。某些投影类型就是被定义为&nbsp;分组投影，他<br />
<br />
们也出现在SQL的group&nbsp;by子句中。<br />
<br />
可以选择把一个别名指派给一个投影，这样可以使投影值被约束或排序所引用。下面是两种不同的<br />
<br />
实现方式：<br />
&nbsp;<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.alias(&nbsp;Projections.groupProperty("color"),&nbsp;"colr"&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">asc</span><span style="color: #000000;">("colr")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.groupProperty("color").</span><span style="color: #0000ff;">as</span><span style="color: #000000;">("colr")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">asc</span><span style="color: #000000;">("colr")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
&nbsp;<br />
alias()和as()方法简便的将一个投影实例包装到另外一个&nbsp;别名的Projection实例中。简而言之，<br />
<br />
当你添加一个投影到一个投影列表中时&nbsp;你可以为它指定一个别名：<br />
&nbsp;<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.projectionList()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.</span><span style="color: #0000ff;">rowCount</span><span style="color: #000000;">(),&nbsp;"catCountByColor"&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.</span><span style="color: #ff00ff;">avg</span><span style="color: #000000;">("weight"),&nbsp;"avgWeight"&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.</span><span style="color: #ff00ff;">max</span><span style="color: #000000;">("weight"),&nbsp;"maxWeight"&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.groupProperty("color"),&nbsp;"color"&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">desc</span><span style="color: #000000;">("catCountByColor")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">desc</span><span style="color: #000000;">("avgWeight")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Domestic.class,&nbsp;"cat")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.createAlias("kittens",&nbsp;"kit")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.projectionList()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.property("cat.name"),&nbsp;"catName"&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.property("kit.name"),&nbsp;"kitName"&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">asc</span><span style="color: #000000;">("catName")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">asc</span><span style="color: #000000;">("kitName")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
也可以使用Property.forName()来表示投影：<br />
&nbsp;<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Property.forName("name")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("color").eq(Color.BLACK)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.projectionList()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Projections.</span><span style="color: #0000ff;">rowCount</span><span style="color: #000000;">().</span><span style="color: #0000ff;">as</span><span style="color: #000000;">("catCountByColor")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("weight").</span><span style="color: #ff00ff;">avg</span><span style="color: #000000;">().</span><span style="color: #0000ff;">as</span><span style="color: #000000;">("avgWeight")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("weight").</span><span style="color: #ff00ff;">max</span><span style="color: #000000;">().</span><span style="color: #0000ff;">as</span><span style="color: #000000;">("maxWeight")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("color").</span><span style="color: #0000ff;">group</span><span style="color: #000000;">().</span><span style="color: #0000ff;">as</span><span style="color: #000000;">("color"&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">desc</span><span style="color: #000000;">("catCountByColor")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;</span><span style="color: #0000ff;">Order</span><span style="color: #000000;">.</span><span style="color: #0000ff;">desc</span><span style="color: #000000;">("avgWeight")&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
<br />
</span><span style="color: #800000; font-weight: bold;">8</span><span style="color: #000000;">.&nbsp;离线(detached)查询和子查询<br />
DetachedCriteria类使你在一个session范围之外创建一个查询，并且可以使用任意的&nbsp;Session来<br />
<br />
执行它。<br />
&nbsp;<br />
DetachedCriteria&nbsp;query&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;DetachedCriteria.forClass(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("sex").eq(</span><span style="color: #ff0000;">'</span><span style="color: #ff0000;">F</span><span style="color: #ff0000;">'</span><span style="color: #000000;">)&nbsp;);<br />
</span><span style="color: #808080;">//</span><span style="color: #000000;">创建一个Session<br />
Session&nbsp;session&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;.;<br />
</span><span style="color: #0000ff;">Transaction</span><span style="color: #000000;">&nbsp;txn&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;session.beginTransaction();<br />
List&nbsp;results&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;query.getExecutableCriteria(session).setMaxResults(</span><span style="color: #800000; font-weight: bold;">100</span><span style="color: #000000;">).list();<br />
txn.</span><span style="color: #0000ff;">commit</span><span style="color: #000000;">();<br />
session.</span><span style="color: #0000ff;">close</span><span style="color: #000000;">();<br />
<br />
<br />
DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过&nbsp;Subqueries或者<br />
Property获得。<br />
&nbsp;<br />
DetachedCriteria&nbsp;avgWeight&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;DetachedCriteria.forClass(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Property.forName("weight").</span><span style="color: #ff00ff;">avg</span><span style="color: #000000;">()&nbsp;);<br />
session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("weight).gt(avgWeight)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
DetachedCriteria&nbsp;weights&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;DetachedCriteria.forClass(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Property.forName("weight")&nbsp;);<br />
session.createCriteria(Cat.class)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Subqueries.geAll("weight",&nbsp;weights)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();<br />
<br />
相互关联的子查询也是有可能的：<br />
&nbsp;<br />
DetachedCriteria&nbsp;avgWeightForSex&nbsp;</span><span style="color: #808080;">=</span><span style="color: #000000;">&nbsp;DetachedCriteria.forClass(Cat.class,&nbsp;"cat2")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Property.forName("weight").</span><span style="color: #ff00ff;">avg</span><span style="color: #000000;">()&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("cat2.sex").eqProperty("cat.sex")&nbsp;);<br />
session.createCriteria(Cat.class,&nbsp;"cat")<br />
&nbsp;&nbsp;&nbsp;&nbsp;.</span><span style="color: #0000ff;">add</span><span style="color: #000000;">(&nbsp;Property.forName("weight).gt(avgWeightForSex)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/jikey/aggbug/323254.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jikey/" target="_blank">豪情</a> 2010-06-10 17:44 <a href="http://www.blogjava.net/jikey/archive/2010/06/10/323254.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中mysql乱码</title><link>http://www.blogjava.net/jikey/archive/2010/06/08/323104.html</link><dc:creator>豪情</dc:creator><author>豪情</author><pubDate>Tue, 08 Jun 2010 15:21:00 GMT</pubDate><guid>http://www.blogjava.net/jikey/archive/2010/06/08/323104.html</guid><wfw:comment>http://www.blogjava.net/jikey/comments/323104.html</wfw:comment><comments>http://www.blogjava.net/jikey/archive/2010/06/08/323104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jikey/comments/commentRss/323104.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jikey/services/trackbacks/323104.html</trackback:ping><description><![CDATA[<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">connection.url</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">jdbc:mysql:</span><span style="color: #008000;">//</span><span style="color: #008000;">localhost:3306/test?useUnicode=true&amp;amp;characterEncoding=UTF-8&lt;/property&gt;</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;!--</span><span style="color: #000000;">&nbsp;乱码&nbsp;</span><span style="color: #000000;">--&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">connection.useUnicode</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">property&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">connection.characterEncoding</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">UTF</span><span style="color: #000000;">-</span><span style="color: #000000;">8</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">property</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> <br />
</span></div>
<img src ="http://www.blogjava.net/jikey/aggbug/323104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jikey/" target="_blank">豪情</a> 2010-06-08 23:21 <a href="http://www.blogjava.net/jikey/archive/2010/06/08/323104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>transient、 persistent、detached状态</title><link>http://www.blogjava.net/jikey/archive/2010/06/08/323100.html</link><dc:creator>豪情</dc:creator><author>豪情</author><pubDate>Tue, 08 Jun 2010 14:57:00 GMT</pubDate><guid>http://www.blogjava.net/jikey/archive/2010/06/08/323100.html</guid><wfw:comment>http://www.blogjava.net/jikey/comments/323100.html</wfw:comment><comments>http://www.blogjava.net/jikey/archive/2010/06/08/323100.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jikey/comments/commentRss/323100.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jikey/services/trackbacks/323100.html</trackback:ping><description><![CDATA[来自于：http://www.blogjava.net/apple0668/archive/2008/10/09/233436.html<br />
<font style="background-color: #c7edcc;"><img alt="" src="../../images/blogjava_net/apple0668/hibernate/show_fpic.png" border="0" height="366" width="412" /></font><br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">transient</span><span style="color: #000000;">、persistent、&nbsp;detached状态关系图如下：<br />
<br />
<br />
<br />
</span><span style="color: #000000;">1</span><span style="color: #000000;">、transient状态的特征：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;在数据库中没有与之匹配的数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;没有纳入session的管理<br />
&nbsp;<br />
</span><span style="color: #000000;">2</span><span style="color: #000000;">、persistent状态的特征：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;persistent状态的对象在数据库中有与之匹配的数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;纳入了session的管理<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;在清理缓存（脏数据检查）的时候,会和数据库同步<br />
&nbsp;<br />
</span><span style="color: #000000;">3</span><span style="color: #000000;">、detached状态的特征：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;在数据库中有与之匹配的数据<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">&nbsp;没有纳入session的管理&nbsp;<br />
<br />
PS：了解这几种状态对深入使用hibernate有比较大的意义，开发过程中减少很多不必要的错误。</span></div>
<br />
<img src ="http://www.blogjava.net/jikey/aggbug/323100.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jikey/" target="_blank">豪情</a> 2010-06-08 22:57 <a href="http://www.blogjava.net/jikey/archive/2010/06/08/323100.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SessionFactory的构建</title><link>http://www.blogjava.net/jikey/archive/2010/06/08/323096.html</link><dc:creator>豪情</dc:creator><author>豪情</author><pubDate>Tue, 08 Jun 2010 12:48:00 GMT</pubDate><guid>http://www.blogjava.net/jikey/archive/2010/06/08/323096.html</guid><wfw:comment>http://www.blogjava.net/jikey/comments/323096.html</wfw:comment><comments>http://www.blogjava.net/jikey/archive/2010/06/08/323096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jikey/comments/commentRss/323096.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jikey/services/trackbacks/323096.html</trackback:ping><description><![CDATA[来自于：http://linweihan.javaeye.com/blog/144652<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">2.6</span><span style="color: #000000;">&nbsp;&nbsp;构建SessionFactory<br />
Hibernate的SessionFactory接口提供Session类的实例，Session类用于完成对数据库的操作。由于&nbsp;SessionFactory实例是线程安全的（而Session实例不是线程安全的），所以每个操作都可以共用同一个SessionFactory来获取Session。<br />
<br />
Hibernate配置文件分为两种格式，一种是xml格式的配置文件，另一种是Java属性文件格式的配置文件，因此构建SessionFactory也有两种方法，下面分别介绍。<br />
<br />
</span><span style="color: #000000;">2.6</span><span style="color: #000000;">.</span><span style="color: #000000;">1</span><span style="color: #000000;">&nbsp;&nbsp;从XML文件读取配置信息构建&nbsp;SessionFactory<br />
从XML文件读取配置信息构建SessionFactory的具体步骤如下。<br />
<br />
（</span><span style="color: #000000;">1</span><span style="color: #000000;">）创建一个Configuration对象，并通过该对象的configura()方法加载Hibernate&nbsp;配置文件，代码如下。<br />
<br />
Configuration&nbsp;config&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Configuration().configure();<br />
<br />
configura()方法：用于告诉Hibernate加载hibernate.cfg.xml文件。&nbsp;Configuration在实例化时默认加载classpath中的hibernate.cfg.xml，当然也可以加载名称不是hibernate.cfg.xml的配置文件，例如wghhibernate.cfg.xml，可以通过以下代码实现。<br />
<br />
Configuration&nbsp;config&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Configuration().configure(</span><span style="color: #000000;">"</span><span style="color: #000000;">wghhibernate.cfg.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<br />
（</span><span style="color: #000000;">2</span><span style="color: #000000;">）完成配置文件和映射文件的加载后，将得到一个包括所有Hibernate运行期参数的&nbsp;Configuration实例，通过Configuration实例<br />
<br />
的buildSessionFactory()方法可以构建一个惟一的SessionFactory，代码如下。<br />
<br />
SessionFactory&nbsp;sessionFactory&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;config.buildSessionFactory();<br />
<br />
构建SessionFactory要放在静态代码块中，因为它只在该类被加载时执行一次。一个典型的构建&nbsp;SessionFactory的代码如下。<br />
<br />
例程2</span><span style="color: #000000;">-</span><span style="color: #000000;">9</span><span style="color: #000000;">：光盘\mr\</span><span style="color: #000000;">02</span><span style="color: #000000;">\sl\</span><span style="color: #000000;">09</span><span style="color: #000000;">\CoreSession.java<br />
<br />
java&nbsp;代码<br />
<br />
&nbsp; </span>import org.hibernate.*;&nbsp; &nbsp;<br />
&nbsp; <br />
import org.hibernate.cfg.*;&nbsp; &nbsp;<br />
&nbsp; <br />
public class CoreSession {&nbsp; &nbsp;<br />
&nbsp; <br />
static SessionFactory sessionFactory;&nbsp; &nbsp;<br />
//注意到这里的SessionFactory都是static的<br />
//初始化Hibernate,创建 SessionFactory实例,只在该类被加载到内存时执行一次&nbsp; &nbsp;<br />
&nbsp; <br />
static{&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; try{&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Configuration config = new Configuration().configure();&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sessionFactory = config.buildSessionFactory();&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; } catch (Exception e) {&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e.getMessage());&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp; &nbsp;<br />
&nbsp; <br />
}&nbsp; &nbsp;<br />
&nbsp; <br />
}&nbsp;&nbsp; <br />
<span style="color: #000000;">&nbsp;<br />
<br />
</span><span style="color: #000000;">2.6</span><span style="color: #000000;">.</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;&nbsp;从Java属性文件读取配置信息构建SessionFactory<br />
从Java属性文件读取配置信息构建SessionFactory的具体步骤如下。<br />
<br />
（</span><span style="color: #000000;">1</span><span style="color: #000000;">）创建一个Configuration对象，此时Hibernate会默认加载classpath中的配置文件hibernate.properties，代码如下。<br />
<br />
Configuration&nbsp;config&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Configuration();<br />
<br />
（</span><span style="color: #000000;">2</span><span style="color: #000000;">）由于在配置文件中缺少相应的配置映射文件的信息，所以此处需要通过编码方式加载，这可以通过Configuration对象的<br />
<br />
addClass()方法实现，具体代码如下。<br />
<br />
config.addClass(BranchForm.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br />
<br />
addClass()方法用于加载实体类。<br />
<br />
（</span><span style="color: #000000;">3</span><span style="color: #000000;">）完成配置文件和映射文件的加载后，将得到一个包括所有Hibernate运行期参数的Configuration实例，通过Configuration实例<br />
<br />
的buildSessionFactory()方法可以构建一个惟一的SessionFactory，代码如下。<br />
<br />
SessionFactory&nbsp;sessionFactory&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;config.buildSessionFactory();<br />
<br />
构建SessionFactory要放在静态代码块中，因为它只需在该类被加载时执行一次，一个典型的构建SessionFactory的代码如下。<br />
<br />
例程2</span><span style="color: #000000;">-</span><span style="color: #000000;">10</span><span style="color: #000000;">：光盘\mr\</span><span style="color: #000000;">02</span><span style="color: #000000;">\sl\</span><span style="color: #000000;">10</span><span style="color: #000000;">&nbsp;\CoreSession.java<br />
<br />
java&nbsp;代码<br />
</span><span style="color: #000000;"><br />
</span>import org.hibernate.*;&nbsp; &nbsp;<br />
&nbsp; <br />
import org.hibernate.cfg.*;&nbsp; &nbsp;<br />
&nbsp; <br />
public class CoreSession {&nbsp; &nbsp;<br />
&nbsp; <br />
static SessionFactory sessionFactory;&nbsp; &nbsp;<br />
&nbsp; <br />
//初始化Hibernate,创建 SessionFactory实例,只在该类被加载到内存时执行一次&nbsp; &nbsp;<br />
&nbsp; <br />
static{&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; try{&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Configuration config = new Configuration();&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; config.addClass(BranchForm.class);&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sessionFactory = config.buildSessionFactory();&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; } catch (Exception e) {&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(e.getMessage());&nbsp; &nbsp;<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; }&nbsp; &nbsp;<br />
&nbsp; <br />
}&nbsp; &nbsp;<br />
&nbsp; <br />
}&nbsp; <br />
<br />
</div>
<br />
<img src ="http://www.blogjava.net/jikey/aggbug/323096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jikey/" target="_blank">豪情</a> 2010-06-08 20:48 <a href="http://www.blogjava.net/jikey/archive/2010/06/08/323096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate主键生成方式 Key Generator</title><link>http://www.blogjava.net/jikey/archive/2010/06/07/322998.html</link><dc:creator>豪情</dc:creator><author>豪情</author><pubDate>Mon, 07 Jun 2010 14:10:00 GMT</pubDate><guid>http://www.blogjava.net/jikey/archive/2010/06/07/322998.html</guid><wfw:comment>http://www.blogjava.net/jikey/comments/322998.html</wfw:comment><comments>http://www.blogjava.net/jikey/archive/2010/06/07/322998.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jikey/comments/commentRss/322998.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jikey/services/trackbacks/322998.html</trackback:ping><description><![CDATA[来自于：http://letle.javaeye.com/blog/78530<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;"><br />
<br />
Hibernate主键生成方式&nbsp;&nbsp;Key&nbsp;Generator<br />
主键产生器<br />
可选项说明：<br />
</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;assigned<br />
主键由外部程序负责生成，无需Hibernate参与。<br />
<br />
</span><span style="color: #000000;">2</span><span style="color: #000000;">)&nbsp;hilo<br />
通过hi</span><span style="color: #000000;">/</span><span style="color: #000000;">lo&nbsp;算法实现的主键生成机制，需要额外的数据库表保存主键生成历史状态。<br />
<br />
</span><span style="color: #000000;">3</span><span style="color: #000000;">)&nbsp;seqhilo<br />
与hilo&nbsp;类似，通过hi</span><span style="color: #000000;">/</span><span style="color: #000000;">lo&nbsp;算法实现的主键生成机制，只是主键历史状态保存在Sequence中，适用于支持Sequence的数据库，如Oracle。<br />
<br />
</span><span style="color: #000000;">4</span><span style="color: #000000;">)&nbsp;increment<br />
主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量，以保存着当前的最大值，之后每次需要生成主键的时候<br />
将此值加1作为主键。<br />
这种方式可能产生的问题是：如果当前有多个实例访问同一个数据库，那么由于各个实例各自维护主键状态，不同实例可能生成同样的主键，从而造成主键重复异常。因此，如果同一数据库有多个实例访问，此方式必须避免使用。<br />
<br />
</span><span style="color: #000000;">5</span><span style="color: #000000;">)&nbsp;identity<br />
采用数据库提供的主键生成机制。如DB2、SQL&nbsp;Server、MySQL中的主键生成机制。<br />
<br />
</span><span style="color: #000000;">6</span><span style="color: #000000;">)&nbsp;sequence<br />
采用数据库提供的sequence&nbsp;机制生成主键。如Oralce&nbsp;中的Sequence。<br />
<br />
</span><span style="color: #000000;">7</span><span style="color: #000000;">)&nbsp;</span><span style="color: #0000ff;">native</span><span style="color: #000000;"><br />
由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。<br />
<br />
</span><span style="color: #000000;">8</span><span style="color: #000000;">)&nbsp;uuid.hex<br />
由Hibernate基于128&nbsp;位唯一值产生算法生成16&nbsp;进制数值（编码后以长度32&nbsp;的字符串表示）作为主键。<br />
<br />
</span><span style="color: #000000;">9</span><span style="color: #000000;">)&nbsp;uuid.string<br />
与uuid.hex&nbsp;类似，只是生成的主键未进行编码（长度16）。在某些数据库中可能出现问题（如PostgreSQL）。<br />
<br />
</span><span style="color: #000000;">10</span><span style="color: #000000;">)&nbsp;foreign<br />
使用外部表的字段作为主键。<br />
一般而言，利用uuid.hex方式生成主键将提供最好的性能和数据库平台适应性。<br />
<br />
另外由于常用的数据库，如Oracle、DB2、SQLServer、MySql&nbsp;等，都提供了易用的主键生成机制（Auto</span><span style="color: #000000;">-</span><span style="color: #000000;">Increase&nbsp;字段或者Sequence）。我们可以在数据库提供的主键生成机制上，采用generator</span><span style="color: #000000;">-</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">native的主键生成方式。不过值得注意的是，一些数据库提供的主键生成机制在效率上未必最佳，大量并发insert数据时可能会引起表之间的互锁。<br />
数据库提供的主键生成机制，往往是通过在一个内部表中保存当前主键状态（如对于自增型主键而言，此内部表中就维护着当前的最大值和递增量），之后每次插入数据会读取这个最大值，然后加上递增量作为新记录的主键，之后再把这个新的最大值更新回内部表中，这样，一次Insert操作可能导致数据库内部多次表读写操作，同时伴随的还有数据的加锁解锁操作，这对性能产生了较大影响。<br />
因此，对于并发Insert要求较高的系统，推荐采用uuid.hex&nbsp;作为主键生成机制。<br />
</span></div>
<br />
<img src ="http://www.blogjava.net/jikey/aggbug/322998.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jikey/" target="_blank">豪情</a> 2010-06-07 22:10 <a href="http://www.blogjava.net/jikey/archive/2010/06/07/322998.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate中hbm的generator属性</title><link>http://www.blogjava.net/jikey/archive/2010/06/07/322997.html</link><dc:creator>豪情</dc:creator><author>豪情</author><pubDate>Mon, 07 Jun 2010 14:07:00 GMT</pubDate><guid>http://www.blogjava.net/jikey/archive/2010/06/07/322997.html</guid><wfw:comment>http://www.blogjava.net/jikey/comments/322997.html</wfw:comment><comments>http://www.blogjava.net/jikey/archive/2010/06/07/322997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jikey/comments/commentRss/322997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jikey/services/trackbacks/322997.html</trackback:ping><description><![CDATA[来自于：http://developer.51cto.com/art/200906/132121.htm<br />
在*.hbm.xml必须声明的&lt; generator&gt;子元素是一个Java类的名字，用来为该持久化类的实例生成唯一的标识。<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;generator&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">sequence</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;"> <br />
</span></div>
<br />
<p>这是一个非常简单的接口；某些应用程序可以选择提供他们自己特定的实现。当然，Hibernate提供了很多内置的实现。下面是一些内置生成器的快
捷名字：</p>
<p>increment（递增） <br />
用于为long,
short或者int类型生成唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。</p>
<p>identity <br />
对DB2,MySQL, MS SQL Server,
Syｂａｓｅ和HypersonicSQL的内置标识字段提供支持。返回的标识符是long, short 或者int类型的。</p>
<p>sequence （序列） <br />
在DB2,PostgreSQL, Oracle, SAP DB,
McKoi中使用序列（sequence)，而在Interｂａｓｅ中使用生成器(generator)。返回的标识符是long, short或者
int类型的。</p>
<p>hilo （高低位） <br />
使用一个高/低位算法来高效的生成long, short或者
int类型的标识符。给定一个表和字段（默认分别是是hibernate_unique_key
和next_hi）作为高位值得来源。高/低位算法生成的标识符只在一个特定的数据库中是唯一的。在使用JTA获得的连接或者用户自行提供的连接中，不要
使用这种生成器。</p>
<p>seqhilo（使用序列的高低位） <br />
使用一个高/低位算法来高效的生成long, short或者
int类型的标识符，给定一个数据库序列（sequence)的名字。</p>
<p>uuid.hex <br />
用一个128-bit的UUID算法生成字符串类型的标识符。在一个网络中唯一（使用了IP地址）。UUID被编码为一
个32位16进制数字的字符串。</p>
<p>uuid.string <br />
使用同样的UUID算法。UUID被编码为一个16个字符长的任意ASCII字符组成的字符串。不能使用在
PostgreSQL数据库中</p>
<p>native（本地） <br />
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。</p>
<p>assigned（程序设置） <br />
让应用程序在save()之前为对象分配一个标示符。</p>
<p>foreign（外部引用） <br />
使用另外一个相关联的对象的标识符。和&lt; one-to-one&gt;联合一起使用。</p>
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">onlyfun.caterpillar.User</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;table</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">USER</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;<br />
<br />
</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">id&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">id</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;type</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">string</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;unsaved</span><span style="color: #000000;">-</span><span style="color: #000000;">value</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">null</span><span style="color: #000000;">"</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;<br />
<br />
&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">column&nbsp;name</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">USER_ID</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;">&nbsp;<br />
<br />
&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">generator&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">uuid.hex</span><span style="color: #000000;">"</span><span style="color: #000000;">/&gt;</span><span style="color: #000000;">&nbsp;<br />
<br />
</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">id</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> <br />
</span></div>
<img src ="http://www.blogjava.net/jikey/aggbug/322997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jikey/" target="_blank">豪情</a> 2010-06-07 22:07 <a href="http://www.blogjava.net/jikey/archive/2010/06/07/322997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate根据POJO导出表</title><link>http://www.blogjava.net/jikey/archive/2010/06/06/322920.html</link><dc:creator>豪情</dc:creator><author>豪情</author><pubDate>Sun, 06 Jun 2010 14:55:00 GMT</pubDate><guid>http://www.blogjava.net/jikey/archive/2010/06/06/322920.html</guid><wfw:comment>http://www.blogjava.net/jikey/comments/322920.html</wfw:comment><comments>http://www.blogjava.net/jikey/archive/2010/06/06/322920.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jikey/comments/commentRss/322920.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jikey/services/trackbacks/322920.html</trackback:ping><description><![CDATA[<div style="background-color: rgb(238, 238, 238); font-size: 13px; border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">package</span><span style="color: rgb(0, 0, 0);">&nbsp;org.apple.hibernate;<br />
<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;org.hibernate.cfg.Configuration;<br />
</span><span style="color: rgb(0, 0, 255);">import</span><span style="color: rgb(0, 0, 0);">&nbsp;org.hibernate.tool.hbm2ddl.SchemaExport;<br />
<br />
<br />
<br />
</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">&nbsp;UserTest{&nbsp;<br />
</span><span style="color: rgb(0, 0, 255);">public</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">static</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">void</span><span style="color: rgb(0, 0, 0);">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: rgb(0, 0, 255);">throws</span><span style="color: rgb(0, 0, 0);">&nbsp;Exception{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">配置环境，分析xml映射文件</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;Configuration&nbsp;conf</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 0);">&nbsp;</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;Configuration().addClass(User.</span><span style="color: rgb(0, 0, 255);">class</span><span style="color: rgb(0, 0, 0);">);<br />
&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 128, 0);">//</span><span style="color: rgb(0, 128, 0);">生成并输出sql到文件（当前目录）和数据库</span><span style="color: rgb(0, 128, 0);"><br />
</span><span style="color: rgb(0, 0, 0);">&nbsp;&nbsp;&nbsp;SchemaExport&nbsp;dbExport</span><span style="color: rgb(0, 0, 0);">=</span><span style="color: rgb(0, 0, 255);">new</span><span style="color: rgb(0, 0, 0);">&nbsp;SchemaExport(conf);<br />
&nbsp;&nbsp;&nbsp;dbExport.create(</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">,&nbsp;</span><span style="color: rgb(0, 0, 255);">true</span><span style="color: rgb(0, 0, 0);">);<br />
}<br />
</span></div>
<img src ="http://www.blogjava.net/jikey/aggbug/322920.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jikey/" target="_blank">豪情</a> 2010-06-06 22:55 <a href="http://www.blogjava.net/jikey/archive/2010/06/06/322920.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>