📄 querycriteria.html
字号:
你可以自行调整<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>15.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>15.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 class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="query-criteria-naturalid"></a>15.9. 根据自然标识查询(Queries by natural identifier)</h2></div></div><div></div></div><p> 对大多数查询,包括条件查询而言,因为查询缓存的失效(invalidation)发生得太频繁,查询缓存不是非常高效。然而,有一种特别的查询,可以通过不变的自然键优化缓存的失效算法。在某些应用中,这种类型的查询比较常见。条件查询API对这种用例提供了特别规约。 </p><p> 首先,你应该对你的entity使用<tt class="literal"><natural-id></tt>来映射自然键,然后打开第二级缓存。 </p><pre class="programlisting"><class name="User"> <cache usage="read-write"/> <id name="id"> <generator class="increment"/> </id> <natural-id> <property name="name"/> <property name="org"/> </natural-id> <property name="password"/></class></pre><p> 注意,此功能对具有<span class="emphasis"><em>mutable</em></span>自然键的entity并不适用。 </p><p> 然后,打开Hibernate 查询缓存。 </p><p> 现在,我们可以用<tt class="literal">Restrictions.naturalId()</tt>来使用更加高效的缓存算法。 </p><pre class="programlisting">session.createCriteria(User.class) .add( Restrictions.naturalId() .set("name", "gavin") .set("org", "hb") ).setCacheable(true) .uniqueResult();</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">第 14 章 HQL: Hibernate查询语言 </td><td width="20%" align="center"><a accesskey="h" href="index.html">起始页</a></td><td width="40%" align="right" valign="top"> 第 16 章 Native SQL查询</td></tr></table></div></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -