📄 querycriteria.html
字号:
抓取策略(Fetching strategies) ”</a>可以获得更多信息。 </p></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="querycriteria-examples"></a>16.6. 查询示例</h2></div></div><div></div></div><p> <tt class="literal">org.hibernate.criterion.Example</tt>类允许你通过一个给定实例 构建一个条件查询。 </p><pre class="programlisting">Cat cat = new Cat();cat.setSex('F');cat.setColor(Color.BLACK);List results = session.createCriteria(Cat.class) .add( Example.create(cat) ) .list();</pre><p> 版本属性、标识符和关联被忽略。默认情况下值为null的属性将被排除。 </p><p> 你可以自行调整<tt class="literal">Example</tt>使之更实用。 </p><pre class="programlisting">Example example = Example.create(cat) .excludeZeroes() //exclude zero valued properties .excludeProperty("color") //exclude the property named "color" .ignoreCase() //perform case insensitive string comparisons .enableLike(); //use like for string comparisonsList results = session.createCriteria(Cat.class) .add(example) .list();</pre><p> 你甚至可以使用examples在关联对象上放置条件。 </p><pre class="programlisting">List results = session.createCriteria(Cat.class) .add( Example.create(cat) ) .createCriteria("mate") .add( Example.create( cat.getMate() ) ) .list();</pre></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="querycriteria-projection"></a>16.7. 投影(Projections)、聚合(aggregation)和分组(grouping)</h2></div></div><div></div></div><p> <tt class="literal">org.hibernate.criterion.Projections</tt>是 <tt class="literal">Projection</tt> 的实例工厂。我们通过调用 <tt class="literal">setProjection()</tt>应用投影到一个查询。 </p><pre class="programlisting">List results = session.createCriteria(Cat.class) .setProjection( Projections.rowCount() ) .add( Restrictions.eq("color", Color.BLACK) ) .list();</pre><pre class="programlisting">List results = session.createCriteria(Cat.class) .setProjection( Projections.projectionList() .add( Projections.rowCount() ) .add( Projections.avg("weight") ) .add( Projections.max("weight") ) .add( Projections.groupProperty("color") ) ) .list();</pre><p> 在一个条件查询中没有必要显式的使用 "group by" 。某些投影类型就是被定义为<span class="emphasis"><em> 分组投影</em></span>,他们也出现在SQL的<tt class="literal">group by</tt>子句中。 </p><p> 你可以选择把一个别名指派给一个投影,这样可以使投影值被约束或排序所引用。下面是两种不同的实现方式: </p><pre class="programlisting">List results = session.createCriteria(Cat.class) .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) ) .addOrder( Order.asc("colr") ) .list();</pre><pre class="programlisting">List results = session.createCriteria(Cat.class) .setProjection( Projections.groupProperty("color").as("colr") ) .addOrder( Order.asc("colr") ) .list();</pre><p> <tt class="literal">alias()</tt>和<tt class="literal">as()</tt>方法简便的将一个投影实例包装到另外一个 别名的<tt class="literal">Projection</tt>实例中。简而言之,当你添加一个投影到一个投影列表中时 你可以为它指定一个别名: </p><pre class="programlisting">List results = session.createCriteria(Cat.class) .setProjection( Projections.projectionList() .add( Projections.rowCount(), "catCountByColor" ) .add( Projections.avg("weight"), "avgWeight" ) .add( Projections.max("weight"), "maxWeight" ) .add( Projections.groupProperty("color"), "color" ) ) .addOrder( Order.desc("catCountByColor") ) .addOrder( Order.desc("avgWeight") ) .list();</pre><pre class="programlisting">List results = session.createCriteria(Domestic.class, "cat") .createAlias("kittens", "kit") .setProjection( Projections.projectionList() .add( Projections.property("cat.name"), "catName" ) .add( Projections.property("kit.name"), "kitName" ) ) .addOrder( Order.asc("catName") ) .addOrder( Order.asc("kitName") ) .list();</pre><p> 你也可以使用<tt class="literal">Property.forName()</tt>来表示投影: </p><pre class="programlisting">List results = session.createCriteria(Cat.class) .setProjection( Property.forName("name") ) .add( Property.forName("color").eq(Color.BLACK) ) .list();</pre><pre class="programlisting">List results = session.createCriteria(Cat.class) .setProjection( Projections.projectionList() .add( Projections.rowCount().as("catCountByColor") ) .add( Property.forName("weight").avg().as("avgWeight") ) .add( Property.forName("weight").max().as("maxWeight") ) .add( Property.forName("color").group().as("color" ) ) .addOrder( Order.desc("catCountByColor") ) .addOrder( Order.desc("avgWeight") ) .list();</pre></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="querycriteria-detachedqueries"></a>16.8. 离线(detached)查询和子查询</h2></div></div><div></div></div><p> <tt class="literal">DetachedCriteria</tt>类使你在一个session范围之外创建一个查询,并且可以使用任意的 <tt class="literal">Session</tt>来执行它。 </p><pre class="programlisting">DetachedCriteria query = DetachedCriteria.forClass(Cat.class) .add( Property.forName("sex").eq('F') ); Session session = ....;Transaction txn = session.beginTransaction();List results = query.getExecutableCriteria(session).setMaxResults(100).list();txn.commit();session.close();</pre><p> <tt class="literal">DetachedCriteria</tt>也可以用以表示子查询。条件实例包含子查询可以通过 <tt class="literal">Subqueries</tt>或者<tt class="literal">Property</tt>获得。 </p><pre class="programlisting">DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class) .setProjection( Property.forName("weight").avg() );session.createCriteria(Cat.class) .add( Property.forName("weight).gt(avgWeight) ) .list();</pre><pre class="programlisting">DetachedCriteria weights = DetachedCriteria.forClass(Cat.class) .setProjection( Property.forName("weight") );session.createCriteria(Cat.class) .add( Subqueries.geAll("weight", weights) ) .list();</pre><p> 甚至相互关联的子查询也是有可能的: </p><pre class="programlisting">DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2") .setProjection( Property.forName("weight").avg() ) .add( Property.forName("cat2.sex").eqProperty("cat.sex") );session.createCriteria(Cat.class, "cat") .add( Property.forName("weight).gt(avgWeightForSex) ) .list();</pre></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="queryhql.html">上一页</a> </td><td width="20%" align="center"><a accesskey="u" href="index.html">上一级</a></td><td width="40%" align="right"> <a accesskey="n" href="querysql.html">下一页</a></td></tr><tr><td width="40%" align="left" valign="top">第 15 章 HQL: Hibernate查询语言 </td><td width="20%" align="center"><a accesskey="h" href="index.html">起始页</a></td><td width="40%" align="right" valign="top"> 第 17 章 Native SQL查询</td></tr></table></div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -