﻿<?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-josson.jin-随笔分类-Hibernate</title><link>http://www.blogjava.net/josson/category/22460.html</link><description>天地生人,有一人应有一人之业;人生在世,生一日当尽一日之勤!</description><language>zh-cn</language><lastBuildDate>Thu, 17 May 2007 13:45:19 GMT</lastBuildDate><pubDate>Thu, 17 May 2007 13:45:19 GMT</pubDate><ttl>60</ttl><item><title>(收藏)条件查询(Criteria Queries)</title><link>http://www.blogjava.net/josson/archive/2007/05/15/117490.html</link><dc:creator>josson</dc:creator><author>josson</author><pubDate>Tue, 15 May 2007 00:55:00 GMT</pubDate><guid>http://www.blogjava.net/josson/archive/2007/05/15/117490.html</guid><wfw:comment>http://www.blogjava.net/josson/comments/117490.html</wfw:comment><comments>http://www.blogjava.net/josson/archive/2007/05/15/117490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/josson/comments/commentRss/117490.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/josson/services/trackbacks/117490.html</trackback:ping><description><![CDATA[http://docs.huihoo.com/framework/hibernate/reference-v3_zh-cn/querycriteria.html<br><br><span style="font-weight: bold;">第 16 章&nbsp; 条件查询(Criteria Queries)</span><br><br>具有一个直观的、可扩展的条件查询API是Hibernate的特色。<br><br><span style="font-weight: bold;">16.1. 创建一个Criteria 实例</span><br><br>org.hibernate.Criteria接口表示特定持久类的一个查询。Session是 Criteria实例的工厂。<br><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;">Criteria&nbsp;crit&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">);<br>crit.setMaxResults(</span><span style="color: #000000;">50</span><span style="color: #000000;">);<br>List&nbsp;cats&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;crit.list();</span></div>
<br><br><span style="font-weight: bold;">16.2. 限制结果集内容</span><br><br>一个单独的查询条件是org.hibernate.criterion.Criterion 接口的一个实例。org.hibernate.criterion.Restrictions类 定义了获得某些内置Criterion类型的工厂方法。<br><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;">List&nbsp;cats&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.like(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Fritz%</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.between(</span><span style="color: #000000;">"</span><span style="color: #000000;">weight</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;minWeight,&nbsp;maxWeight)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br><br>约束可以按逻辑分组。<br><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;">List&nbsp;cats&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.like(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Fritz%</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.or(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Restrictions.eq(&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">age</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Integer(</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Restrictions.isNull(</span><span style="color: #000000;">"</span><span style="color: #000000;">age</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br><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;">List&nbsp;cats&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.in(&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;String[]&nbsp;{&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Fritz</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Izi</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Pk</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;}&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.disjunction()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.isNull(</span><span style="color: #000000;">"</span><span style="color: #000000;">age</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.eq(</span><span style="color: #000000;">"</span><span style="color: #000000;">age</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Integer(</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.eq(</span><span style="color: #000000;">"</span><span style="color: #000000;">age</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Integer(</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.eq(</span><span style="color: #000000;">"</span><span style="color: #000000;">age</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Integer(</span><span style="color: #000000;">2</span><span style="color: #000000;">)&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br><br>Hibernate提供了相当多的内置criterion类型(Restrictions 子类), 但是尤其有用的是可以允许你直接使用SQL。<br><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;">List&nbsp;cats&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.sql(</span><span style="color: #000000;">"</span><span style="color: #000000;">lower({alias}.name)&nbsp;like&nbsp;lower(?)</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Fritz%</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Hibernate.STRING)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br><br>{alias}占位符应当被替换为被查询实体的列别名。<br><br>Property实例是获得一个条件的另外一种途径。你可以通过调用Property.forName() 创建一个Property。<br><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;">Property&nbsp;age&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Property.forName(</span><span style="color: #000000;">"</span><span style="color: #000000;">age</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>List&nbsp;cats&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.disjunction()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;age.isNull()&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;age.eq(&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Integer(</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;age.eq(&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Integer(</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;age.eq(&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Integer(</span><span style="color: #000000;">2</span><span style="color: #000000;">)&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Property.forName(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">).in(&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;String[]&nbsp;{&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Fritz</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Izi</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Pk</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;}&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br><br><span style="font-weight: bold;">16.3. 结果集排序</span><br><br>你可以使用org.hibernate.criterion.Order来为查询结果排序。<br><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;">List&nbsp;cats&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.like(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">F%</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.asc(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.desc(</span><span style="color: #000000;">"</span><span style="color: #000000;">age</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.setMaxResults(</span><span style="color: #000000;">50</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<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;">List&nbsp;cats&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Property.forName(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">).like(</span><span style="color: #000000;">"</span><span style="color: #000000;">F%</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Property.forName(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">).asc()&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Property.forName(</span><span style="color: #000000;">"</span><span style="color: #000000;">age</span><span style="color: #000000;">"</span><span style="color: #000000;">).desc()&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.setMaxResults(</span><span style="color: #000000;">50</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br><br><span style="font-weight: bold;">16.4. 关联</span><br><br>你可以使用createCriteria()非常容易的在互相关联的实体间建立 约束。<br><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;">List&nbsp;cats&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.like(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">F%</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria(</span><span style="color: #000000;">"</span><span style="color: #000000;">kittens</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.like(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">F%</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br><br>注意第二个 createCriteria()返回一个新的 Criteria实例，该实例引用kittens 集合中的元素。<br><br>接下来，替换形态在某些情况下也是很有用的。<br><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;">List&nbsp;cats&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.createAlias(</span><span style="color: #000000;">"</span><span style="color: #000000;">kittens</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">kt</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.createAlias(</span><span style="color: #000000;">"</span><span style="color: #000000;">mate</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">mt</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.eqProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">kt.name</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">mt.name</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br><br>(createAlias()并不创建一个新的 Criteria实例。)<br><br>Cat实例所保存的之前两次查询所返回的kittens集合是 没有被条件预过滤的。如果你希望只获得符合条件的kittens， 你必须使用returnMaps()。<br><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;">List&nbsp;cats&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria(</span><span style="color: #000000;">"</span><span style="color: #000000;">kittens</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">kt</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.eq(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">F%</span><span style="color: #000000;">"</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: #000000;">=</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: #000000;">=</span><span style="color: #000000;">&nbsp;(Map)&nbsp;iter.next();<br>&nbsp;&nbsp;&nbsp;&nbsp;Cat&nbsp;cat&nbsp;</span><span style="color: #000000;">=</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: #000000;">=</span><span style="color: #000000;">&nbsp;(Cat)&nbsp;map.get(</span><span style="color: #000000;">"</span><span style="color: #000000;">kt</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>}</span></div>
<br><br><span style="font-weight: bold;">16.5. 动态关联抓取</span><br><br>你可以使用setFetchMode()在运行时定义动态关联抓取的语义。<br><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;">List&nbsp;cats&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sess.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.like(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Fritz%</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.setFetchMode(</span><span style="color: #000000;">"</span><span style="color: #000000;">mate</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;FetchMode.EAGER)<br>&nbsp;&nbsp;&nbsp;&nbsp;.setFetchMode(</span><span style="color: #000000;">"</span><span style="color: #000000;">kittens</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;FetchMode.EAGER)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br><br>这个查询可以通过外连接抓取mate和kittens。 查看第 20.1 节 &#8220; 抓取策略(Fetching strategies) &#8221;可以获得更多信息。<br>16.6. 查询示例<br><br>org.hibernate.criterion.Example类允许你通过一个给定实例 构建一个条件查询。<br><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;">Cat&nbsp;cat&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Cat();<br>cat.setSex(</span><span style="color: #000000;">'</span><span style="color: #000000;">F</span><span style="color: #000000;">'</span><span style="color: #000000;">);<br>cat.setColor(Color.BLACK);<br>List&nbsp;results&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Example.create(cat)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br><br>版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。<br><br>你可以自行调整Example使之更实用。<br><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;">Example&nbsp;example&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Example.create(cat)<br>&nbsp;&nbsp;&nbsp;&nbsp;.excludeZeroes()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">exclude&nbsp;zero&nbsp;valued&nbsp;properties</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;.excludeProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">color</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">exclude&nbsp;the&nbsp;property&nbsp;named&nbsp;"color"</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;.ignoreCase()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">perform&nbsp;case&nbsp;insensitive&nbsp;string&nbsp;comparisons</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;.enableLike();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">use&nbsp;like&nbsp;for&nbsp;string&nbsp;comparisons</span><span style="color: #008000;"><br></span><span style="color: #000000;">List&nbsp;results&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(example)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br><br>你甚至可以使用examples在关联对象上放置条件。<br><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;">List&nbsp;results&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Example.create(cat)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.createCriteria(</span><span style="color: #000000;">"</span><span style="color: #000000;">mate</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Example.create(&nbsp;cat.getMate()&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br><br><span style="font-weight: bold;">16.7. 投影(Projections)、聚合（aggregation）和分组（grouping）</span><br><br>org.hibernate.criterion.Projections是 Projection 的实例工厂。我们通过调用 setProjection()应用投影到一个查询。<br><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;">List&nbsp;results&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.rowCount()&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Restrictions.eq(</span><span style="color: #000000;">"</span><span style="color: #000000;">color</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;Color.BLACK)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();<br><br>List&nbsp;results&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.projectionList()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.rowCount()&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.avg(</span><span style="color: #000000;">"</span><span style="color: #000000;">weight</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.max(</span><span style="color: #000000;">"</span><span style="color: #000000;">weight</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.groupProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">color</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br><br>在一个条件查询中没有必要显式的使用 "group by" 。某些投影类型就是被定义为 分组投影，他们也出现在SQL的group by子句中。<br><br>你可以选择把一个别名指派给一个投影，这样可以使投影值被约束或排序所引用。下面是两种不同的实现方式：<br><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;">List&nbsp;results&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.alias(&nbsp;Projections.groupProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">color</span><span style="color: #000000;">"</span><span style="color: #000000;">),&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">colr</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.asc(</span><span style="color: #000000;">"</span><span style="color: #000000;">colr</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();<br><br>List&nbsp;results&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.groupProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">color</span><span style="color: #000000;">"</span><span style="color: #000000;">).as(</span><span style="color: #000000;">"</span><span style="color: #000000;">colr</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.asc(</span><span style="color: #000000;">"</span><span style="color: #000000;">colr</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br><br>alias()和as()方法简便的将一个投影实例包装到另外一个 别名的Projection实例中。简而言之，当你添加一个投影到一个投影列表中时 你可以为它指定一个别名：<br><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;">List&nbsp;results&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.projectionList()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.rowCount(),&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">catCountByColor</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.avg(</span><span style="color: #000000;">"</span><span style="color: #000000;">weight</span><span style="color: #000000;">"</span><span style="color: #000000;">),&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">avgWeight</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.max(</span><span style="color: #000000;">"</span><span style="color: #000000;">weight</span><span style="color: #000000;">"</span><span style="color: #000000;">),&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">maxWeight</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.groupProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">color</span><span style="color: #000000;">"</span><span style="color: #000000;">),&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">color</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.desc(</span><span style="color: #000000;">"</span><span style="color: #000000;">catCountByColor</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.desc(</span><span style="color: #000000;">"</span><span style="color: #000000;">avgWeight</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();<br><br>List&nbsp;results&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Domestic.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">cat</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.createAlias(</span><span style="color: #000000;">"</span><span style="color: #000000;">kittens</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">kit</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.projectionList()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.property(</span><span style="color: #000000;">"</span><span style="color: #000000;">cat.name</span><span style="color: #000000;">"</span><span style="color: #000000;">),&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">catName</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.property(</span><span style="color: #000000;">"</span><span style="color: #000000;">kit.name</span><span style="color: #000000;">"</span><span style="color: #000000;">),&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">kitName</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.asc(</span><span style="color: #000000;">"</span><span style="color: #000000;">catName</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.asc(</span><span style="color: #000000;">"</span><span style="color: #000000;">kitName</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br><br>你也可以使用Property.forName()来表示投影：<br><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;">List&nbsp;results&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Property.forName(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Property.forName(</span><span style="color: #000000;">"</span><span style="color: #000000;">color</span><span style="color: #000000;">"</span><span style="color: #000000;">).eq(Color.BLACK)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();<br><br>List&nbsp;results&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Projections.projectionList()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Projections.rowCount().as(</span><span style="color: #000000;">"</span><span style="color: #000000;">catCountByColor</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Property.forName(</span><span style="color: #000000;">"</span><span style="color: #000000;">weight</span><span style="color: #000000;">"</span><span style="color: #000000;">).avg().as(</span><span style="color: #000000;">"</span><span style="color: #000000;">avgWeight</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Property.forName(</span><span style="color: #000000;">"</span><span style="color: #000000;">weight</span><span style="color: #000000;">"</span><span style="color: #000000;">).max().as(</span><span style="color: #000000;">"</span><span style="color: #000000;">maxWeight</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Property.forName(</span><span style="color: #000000;">"</span><span style="color: #000000;">color</span><span style="color: #000000;">"</span><span style="color: #000000;">).group().as(</span><span style="color: #000000;">"</span><span style="color: #000000;">color</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.desc(</span><span style="color: #000000;">"</span><span style="color: #000000;">catCountByColor</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.addOrder(&nbsp;Order.desc(</span><span style="color: #000000;">"</span><span style="color: #000000;">avgWeight</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br><br><span style="font-weight: bold;">16.8. 离线(detached)查询和子查询</span><br><br>DetachedCriteria类使你在一个session范围之外创建一个查询，并且可以使用任意的 Session来执行它。<br><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;">DetachedCriteria&nbsp;query&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DetachedCriteria.forClass(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Property.forName(</span><span style="color: #000000;">"</span><span style="color: #000000;">sex</span><span style="color: #000000;">"</span><span style="color: #000000;">).eq(</span><span style="color: #000000;">'</span><span style="color: #000000;">F</span><span style="color: #000000;">'</span><span style="color: #000000;">)&nbsp;);<br>&nbsp;&nbsp;&nbsp;<br>Session&nbsp;session&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif">.;<br>Transaction&nbsp;txn&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;session.beginTransaction();<br>List&nbsp;results&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;query.getExecutableCriteria(session).setMaxResults(</span><span style="color: #000000;">100</span><span style="color: #000000;">).list();<br>txn.commit();<br>session.close();</span></div>
<br><br>DetachedCriteria也可以用以表示子查询。条件实例包含子查询可以通过 Subqueries或者Property获得。<br><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;">DetachedCriteria&nbsp;avgWeight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DetachedCriteria.forClass(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Property.forName(</span><span style="color: #000000;">"</span><span style="color: #000000;">weight</span><span style="color: #000000;">"</span><span style="color: #000000;">).avg()&nbsp;);<br>session.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Property.forName(</span><span style="color: #000000;">"</span><span style="color: #000000;">weight).gt(avgWeight)&nbsp;)</span><span style="color: #000000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;.list();<br><br>DetachedCriteria&nbsp;weights&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DetachedCriteria.forClass(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Property.forName(</span><span style="color: #000000;">"</span><span style="color: #000000;">weight</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;);<br>session.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Subqueries.geAll(</span><span style="color: #000000;">"</span><span style="color: #000000;">weight</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;weights)&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br><br>甚至相互关联的子查询也是有可能的：<br><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;">DetachedCriteria&nbsp;avgWeightForSex&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DetachedCriteria.forClass(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">cat2</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(&nbsp;Property.forName(</span><span style="color: #000000;">"</span><span style="color: #000000;">weight</span><span style="color: #000000;">"</span><span style="color: #000000;">).avg()&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Property.forName(</span><span style="color: #000000;">"</span><span style="color: #000000;">cat2.sex</span><span style="color: #000000;">"</span><span style="color: #000000;">).eqProperty(</span><span style="color: #000000;">"</span><span style="color: #000000;">cat.sex</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;);<br>session.createCriteria(Cat.</span><span style="color: #0000ff;">class</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">cat</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;.add(&nbsp;Property.forName(</span><span style="color: #000000;">"</span><span style="color: #000000;">weight).gt(avgWeightForSex)&nbsp;)</span><span style="color: #000000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;.list();</span></div>
<br> <img src ="http://www.blogjava.net/josson/aggbug/117490.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/josson/" target="_blank">josson</a> 2007-05-15 08:55 <a href="http://www.blogjava.net/josson/archive/2007/05/15/117490.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 中聚合函数的使用</title><link>http://www.blogjava.net/josson/archive/2007/05/15/117488.html</link><dc:creator>josson</dc:creator><author>josson</author><pubDate>Tue, 15 May 2007 00:50:00 GMT</pubDate><guid>http://www.blogjava.net/josson/archive/2007/05/15/117488.html</guid><wfw:comment>http://www.blogjava.net/josson/comments/117488.html</wfw:comment><comments>http://www.blogjava.net/josson/archive/2007/05/15/117488.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/josson/comments/commentRss/117488.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/josson/services/trackbacks/117488.html</trackback:ping><description><![CDATA[<font size="4">Criteria接口的Projections类主要用于帮助Criteria接口完成数据的分组查询和统计功能:<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;"><font>List&nbsp;cats</font></span><span style="color: #000000;"><font>=</font></span><span style="color: #000000;"><font>session.createCriteria(Cat.</font></span><span style="color: #0000ff;"><font>class</font></span><span style="color: #000000;"><font>)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.setProjection(Projections.projectionList()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(Projections.rowCount())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(Projections.avg(</font></span><span style="color: #000000;"><font>"</font></span><span style="color: #000000;"><font>weight</font></span><span style="color: #000000;"><font>"</font></span><span style="color: #000000;"><font>))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(Projections.max(</font></span><span style="color: #000000;"><font>"</font></span><span style="color: #000000;"><font>weight</font></span><span style="color: #000000;"><font>"</font></span><span style="color: #000000;"><font>))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(Projections.min(</font></span><span style="color: #000000;"><font>"</font></span><span style="color: #000000;"><font>weight</font></span><span style="color: #000000;"><font>"</font></span><span style="color: #000000;"><font>))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.add(Projections.groupProperty(</font></span><span style="color: #000000;"><font>"</font></span><span style="color: #000000;"><font>color</font></span><span style="color: #000000;"><font>"</font></span><span style="color: #000000;"><font>))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;).addOrder(Order.asc(</font></span><span style="color: #000000;"><font>"</font></span><span style="color: #000000;"><font>color</font></span><span style="color: #000000;"><font>"</font></span><span style="color: #000000;"><font>)).list();</font></span></div>
<br>示例</font><font size="4">代码相当于:<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: #0000ff;"><font>select</font></span><span style="color: #000000;"><font>&nbsp;color,</font></span><span style="color: #ff00ff;"><font>count</font></span><span style="color: #000000;"><font>(</font></span><span style="color: #808080;"><font>*</font></span><span style="color: #000000;"><font>),</font></span><span style="color: #ff00ff;"><font>avg</font></span><span style="color: #000000;"><font>(weight),</font></span><span style="color: #ff00ff;"><font>max</font></span><span style="color: #000000;"><font>(weight),</font></span><span style="color: #ff00ff;"><font>min</font></span><span style="color: #000000;"><font>(weight),</font></span><span style="color: #ff00ff;"><font>min</font></span><span style="color: #000000;"><font>(weight)&nbsp;</font></span><span style="color: #0000ff;"><font>from</font></span><span style="color: #000000;"><font>&nbsp;cat&nbsp;</font></span><span style="color: #0000ff;"><font>group</font></span><span style="color: #000000;"><font>&nbsp;</font></span><span style="color: #0000ff;"><font>by</font></span><span style="color: #000000;"><font>&nbsp;color&nbsp;</font></span><span style="color: #0000ff;"><font>order</font></span><span style="color: #000000;"><font>&nbsp;</font></span><span style="color: #0000ff;"><font>by</font></span><span style="color: #000000;"><font>&nbsp;color&nbsp;</font></span><span style="color: #0000ff;"><font>asc</font></span><span style="color: #000000;"><font>;</font></span></div>
<br></font> <img src ="http://www.blogjava.net/josson/aggbug/117488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/josson/" target="_blank">josson</a> 2007-05-15 08:50 <a href="http://www.blogjava.net/josson/archive/2007/05/15/117488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>