📄 objectstate.html
字号:
Query q = sess.createQuery("from DomesticCat cat where cat.name = :name");q.setString("name", "Fritz");Iterator cats = q.iterate();</pre><pre class="programlisting">//positional parameterQuery q = sess.createQuery("from DomesticCat cat where cat.name = ?");q.setString(0, "Izi");Iterator cats = q.iterate();</pre><pre class="programlisting">//named parameter listList names = new ArrayList();names.add("Izi");names.add("Fritz");Query q = sess.createQuery("from DomesticCat cat where cat.name in (:namesList)");q.setParameterList("namesList", names);List cats = q.list();</pre></div><div class="sect3" lang="zh-cn"><div class="titlepage"><div><div><h4 class="title"><a name="objectstate-querying-executing-pagination"></a>11.4.1.5. 分页</h4></div></div><div></div></div><p> 如果你需要指定结果集的范围(希望返回的最大行数/或开始的行数),应该使用<tt class="literal">Query</tt>接口提供的方法: </p><pre class="programlisting">Query q = sess.createQuery("from DomesticCat cat");q.setFirstResult(20);q.setMaxResults(10);List cats = q.list();</pre><p> Hibernate 知道如何将这个有限定条件的查询转换成你的数据库的原生SQL(native SQL)。 </p></div><div class="sect3" lang="zh-cn"><div class="titlepage"><div><div><h4 class="title"><a name="objectstate-querying-executing-scrolling"></a>11.4.1.6. 可滚动遍历(Scrollable iteration)</h4></div></div><div></div></div><p> 如果你的JDBC驱动支持可滚动的<tt class="literal">ResuleSet</tt>,<tt class="literal">Query</tt>接口可以使用<tt class="literal">ScrollableResults</tt>,允许你在查询结果中灵活游走。 </p><pre class="programlisting">Query q = sess.createQuery("select cat.name, cat from DomesticCat cat " + "order by cat.name");ScrollableResults cats = q.scroll();if ( cats.first() ) { // find the first name on each page of an alphabetical list of cats by name firstNamesOfPages = new ArrayList(); do { String name = cats.getString(0); firstNamesOfPages.add(name); } while ( cats.scroll(PAGE_SIZE) ); // Now get the first page of cats pageOfCats = new ArrayList(); cats.beforeFirst(); int i=0; while( ( PAGE_SIZE > i++ ) && cats.next() ) pageOfCats.add( cats.get(1) );}cats.close()</pre><p> 请注意,使用此功能需要保持数据库连接(以及游标(cursor))处于一直打开状态。 如果你需要断开连接使用分页功能,请使用<tt class="literal">setMaxResult()</tt>/<tt class="literal">setFirstResult()</tt> </p></div><div class="sect3" lang="zh-cn"><div class="titlepage"><div><div><h4 class="title"><a name="objectstate-querying-executing-named"></a>11.4.1.7. 外置命名查询(Externalizing named queries)</h4></div></div><div></div></div><p> 你可以在映射文件中定义命名查询(named queries)。 (如果你的查询串中包含可能被解释为XML标记(markup)的字符,别忘了用<tt class="literal">CDATA</tt>包裹起来。) </p><pre class="programlisting"><query name="eg.DomesticCat.by.name.and.minimum.weight"><![CDATA[ from eg.DomesticCat as cat where cat.name = ? and cat.weight > ?] ]></query></pre><p> 参数绑定及执行以编程方式(programatically)完成: </p><pre class="programlisting">Query q = sess.getNamedQuery("eg.DomesticCat.by.name.and.minimum.weight");q.setString(0, name);q.setInt(1, minWeight);List cats = q.list();</pre><p> 请注意实际的程序代码与所用的查询语言无关,你也可在元数据中定义原生SQL(native SQL)查询, 或将原有的其他的查询语句放在配置文件中,这样就可以让Hibernate统一管理,达到迁移的目的。 </p></div></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="objectstate-filtering"></a>11.4.2. 过滤集合</h3></div></div><div></div></div><p> 集合<span class="emphasis"><em>过滤器(filter)</em></span>是一种用于一个持久化集合或者数组的特殊的查询。查询字符串中可以使用<tt class="literal">"this"</tt>来引用集合中的当前元素。 </p><pre class="programlisting">Collection blackKittens = session.createFilter( pk.getKittens(), "where this.color = ?") .setParameter( Color.BLACK, Hibernate.custom(ColorUserType.class) ) .list());</pre><p> 返回的集合可以被认为是一个包(bag, 无顺序可重复的集合(collection)),它是所给集合的副本。 原来的集合不会被改动(这与“过滤器(filter)”的隐含的含义不符,不过与我们期待的行为一致)。 </p><p> 请注意过滤器(filter)并不需要<tt class="literal">from</tt>子句(当然需要的话它们也可以加上)。过滤器(filter)不限定于只能返回集合元素本身。 </p><pre class="programlisting">Collection blackKittenMates = session.createFilter( pk.getKittens(), "select this.mate where this.color = eg.Color.BLACK.intValue") .list();</pre><p> 即使无条件的过滤器(filter)也是有意义的。例如,用于加载一个大集合的子集: </p><pre class="programlisting">Collection tenKittens = session.createFilter( mother.getKittens(), "") .setFirstResult(0).setMaxResults(10) .list();</pre></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="objecstate-querying-criteria"></a>11.4.3. 条件查询(Criteria queries)</h3></div></div><div></div></div><p> HQL极为强大,但是有些人希望能够动态的使用一种面向对象API创建查询,而非在他们的Java代码中嵌入字符串。对于那部分人来说,Hibernate提供了直观的<tt class="literal">Criteria</tt>查询API。 </p><pre class="programlisting">Criteria crit = session.createCriteria(Cat.class);crit.add( Expression.eq( "color", eg.Color.BLACK ) );crit.setMaxResults(10);List cats = crit.list();</pre><p> <tt class="literal">Criteria</tt>以及相关的<tt class="literal">样例(Example)</tt>API将会再<a href="querycriteria.html" title="第 16 章 
 条件查询(Criteria Queries)
 ">第 16 章 <i> 条件查询(Criteria Queries) </i></a>中详细讨论。 </p></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="objectstate-querying-nativesql"></a>11.4.4. 使用原生SQL的查询</h3></div></div><div></div></div><p> 你可以使用<tt class="literal">createSQLQuery()</tt>方法,用SQL来描述查询,并由Hibernate处理将结果集转换成对象的工作。 请注意,你可以在任何时候调用<tt class="literal">session.connection()</tt>来获得并使用JDBC <tt class="literal">Connection</tt>对象。 如果你选择使用Hibernate的API, 你必须把SQL别名用大括号包围起来: </p><pre class="programlisting">List cats = session.createSQLQuery(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -