📄 querycriteria.html
字号:
<html><head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>第 16 章 条件查询(Criteria Queries) </title><link rel="stylesheet" href="../shared/css/html.css" type="text/css"><meta name="generator" content="DocBook XSL Stylesheets V1.65.1"><link rel="home" href="index.html" title="HIBERNATE - 符合Java习惯的关系数据库持久化"><link rel="up" href="index.html" title="HIBERNATE - 符合Java习惯的关系数据库持久化"><link rel="previous" href="queryhql.html" title="第 15 章 HQL: Hibernate查询语言"><link rel="next" href="querysql.html" title="第 17 章 Native SQL查询"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">第 16 章 条件查询(Criteria Queries) </th></tr><tr><td width="20%" align="left"><a accesskey="p" href="queryhql.html">上一页</a> </td><th width="60%" align="center"> </th><td width="20%" align="right"> <a accesskey="n" href="querysql.html">下一页</a></td></tr></table><hr></div><div class="chapter" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title"><a name="querycriteria"></a>第 16 章 条件查询(Criteria Queries) </h2></div></div><div></div></div><p> 具有一个直观的、可扩展的条件查询API是Hibernate的特色。 </p><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="querycriteria-creating"></a>16.1. 创建一个<tt class="literal">Criteria</tt> 实例</h2></div></div><div></div></div><p> <tt class="literal">org.hibernate.Criteria</tt>接口表示特定持久类的一个查询。<tt class="literal">Session</tt>是 <tt class="literal">Criteria</tt>实例的工厂。 </p><pre class="programlisting">Criteria crit = sess.createCriteria(Cat.class);crit.setMaxResults(50);List cats = crit.list();</pre></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="querycriteria-narrowing"></a>16.2. 限制结果集内容</h2></div></div><div></div></div><p> 一个单独的查询条件是<tt class="literal">org.hibernate.criterion.Criterion</tt> 接口的一个实例。<tt class="literal">org.hibernate.criterion.Restrictions</tt>类 定义了获得某些内置<tt class="literal">Criterion</tt>类型的工厂方法。 </p><pre class="programlisting">List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") ) .add( Restrictions.between("weight", minWeight, maxWeight) ) .list();</pre><p> 约束可以按逻辑分组。 </p><pre class="programlisting">List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") ) .add( Restrictions.or( Restrictions.eq( "age", new Integer(0) ), Restrictions.isNull("age") ) ) .list();</pre><pre class="programlisting">List cats = sess.createCriteria(Cat.class) .add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) ) .add( Restrictions.disjunction() .add( Restrictions.isNull("age") ) .add( Restrictions.eq("age", new Integer(0) ) ) .add( Restrictions.eq("age", new Integer(1) ) ) .add( Restrictions.eq("age", new Integer(2) ) ) ) ) .list();</pre><p> Hibernate提供了相当多的内置criterion类型(<tt class="literal">Restrictions</tt> 子类), 但是尤其有用的是可以允许你直接使用SQL。 </p><pre class="programlisting">List cats = sess.createCriteria(Cat.class) .add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%", Hibernate.STRING) ) .list();</pre><p> <tt class="literal">{alias}</tt>占位符应当被替换为被查询实体的列别名。 </p><p> <tt class="literal">Property</tt>实例是获得一个条件的另外一种途径。你可以通过调用<tt class="literal">Property.forName()</tt> 创建一个<tt class="literal">Property</tt>。 </p><pre class="programlisting">Property age = Property.forName("age");List cats = sess.createCriteria(Cat.class) .add( Restrictions.disjunction() .add( age.isNull() ) .add( age.eq( new Integer(0) ) ) .add( age.eq( new Integer(1) ) ) .add( age.eq( new Integer(2) ) ) ) ) .add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) ) .list();</pre></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="querycriteria-ordering"></a>16.3. 结果集排序</h2></div></div><div></div></div><p> 你可以使用<tt class="literal">org.hibernate.criterion.Order</tt>来为查询结果排序。 </p><pre class="programlisting">List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "F%") .addOrder( Order.asc("name") ) .addOrder( Order.desc("age") ) .setMaxResults(50) .list();</pre><pre class="programlisting">List cats = sess.createCriteria(Cat.class) .add( Property.forName("name").like("F%") ) .addOrder( Property.forName("name").asc() ) .addOrder( Property.forName("age").desc() ) .setMaxResults(50) .list();</pre></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="querycriteria-associations"></a>16.4. 关联</h2></div></div><div></div></div><p> 你可以使用<tt class="literal">createCriteria()</tt>非常容易的在互相关联的实体间建立 约束。 </p><pre class="programlisting">List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "F%") .createCriteria("kittens") .add( Restrictions.like("name", "F%") .list();</pre><p> 注意第二个 <tt class="literal">createCriteria()</tt>返回一个新的 <tt class="literal">Criteria</tt>实例,该实例引用<tt class="literal">kittens</tt> 集合中的元素。 </p><p> 接下来,替换形态在某些情况下也是很有用的。 </p><pre class="programlisting">List cats = sess.createCriteria(Cat.class) .createAlias("kittens", "kt") .createAlias("mate", "mt") .add( Restrictions.eqProperty("kt.name", "mt.name") ) .list();</pre><p> (<tt class="literal">createAlias()</tt>并不创建一个新的 <tt class="literal">Criteria</tt>实例。) </p><p> <tt class="literal">Cat</tt>实例所保存的之前两次查询所返回的kittens集合是 <span class="emphasis"><em>没有</em></span>被条件预过滤的。如果你希望只获得符合条件的kittens, 你必须使用<tt class="literal">returnMaps()</tt>。 </p><pre class="programlisting">List cats = sess.createCriteria(Cat.class) .createCriteria("kittens", "kt") .add( Restrictions.eq("name", "F%") ) .returnMaps() .list();Iterator iter = cats.iterator();while ( iter.hasNext() ) { Map map = (Map) iter.next(); Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS); Cat kitten = (Cat) map.get("kt");}</pre></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="querycriteria-dynamicfetching"></a>16.5. 动态关联抓取</h2></div></div><div></div></div><p> 你可以使用<tt class="literal">setFetchMode()</tt>在运行时定义动态关联抓取的语义。 </p><pre class="programlisting">List cats = sess.createCriteria(Cat.class) .add( Restrictions.like("name", "Fritz%") ) .setFetchMode("mate", FetchMode.EAGER) .setFetchMode("kittens", FetchMode.EAGER) .list();</pre><p> 这个查询可以通过外连接抓取<tt class="literal">mate</tt>和<tt class="literal">kittens</tt>。 查看<a href="performance.html#performance-fetching" title="20.1. 
 
 抓取策略(Fetching strategies)
 ">第 20.1 节 “
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -