📄 manipulatingdata.html
字号:
"from Customer customer, " + "Product product " + "join customer.purchases purchase " + "where product = purchase.product");</pre><p> 如果对上面的查询使用<tt class="literal">find()</tt>,会返回一个非常大的JDBC<tt class="literal">ResultSet</tt>,包含很多重复的相同数据。 </p><p> 有时候Hibernate查询会每行返回多种对象,这种情况下,每行会返回一个数组,包含多个对象元素: </p><pre class="programlisting">Iterator foosAndBars = sess.iterate( "select foo, bar from Foo foo, Bar bar " + "where bar.date = foo.date");while ( foosAndBars.hasNext() ) { Object[] tuple = (Object[]) foosAndBars.next(); Foo foo = tuple[0]; Bar bar = tuple[1]; ....}</pre><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="manipulatingdata-scalarqueries"></a>9.3.1. 标量查询(Scalar query)</h3></div></div><div></div></div><p> 查询可以在<tt class="literal">select</tt>子句中指定类的属性。甚至可以调用SQL的统计函数。属性或者统计值被称为“标量(scalar)”结果。 </p><pre class="programlisting">Iterator results = sess.iterate( "select cat.color, min(cat.birthdate), count(cat) from Cat cat " + "group by cat.color");while ( results.hasNext() ) { Object[] row = results.next(); Color type = (Color) row[0]; Date oldest = (Date) row[1]; Integer count = (Integer) row[2]; .....}</pre><pre class="programlisting">Iterator iter = sess.iterate( "select cat.type, cat.birthdate, cat.name from DomesticCat cat");</pre><pre class="programlisting">List list = sess.find( "select cat, cat.mate.name from DomesticCat cat");</pre></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="manipulatingdata-queryinterface"></a>9.3.2. 查询接口(Query interface)</h3></div></div><div></div></div><p> 如果你需要为你的结果集设置边界(你需要获取的最大行数与/或你希望获取的第一行),你应该得到一个<tt class="literal">net.sf.hibernate.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> 你甚至可以在映射文档中定义命名查询。(记得用一个<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><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> 查询界面支持使用命名参数。命名参数用<tt class="literal">:name</tt>的形式在查询字符串中表示。在<tt class="literal">Query</tt>中有方法把实际参数绑定到命名参数或者JDBC风格的<tt class="literal">?</tt>参数。<span class="emphasis"><em>和JDBC不同,Hibernate的参数从0开始计数。</em></span> 使用命名参数有一些好处: </p><div class="itemizedlist"><ul type="disc" compact><li><p> 命名参数不依赖于它们在查询字符串中出现的顺序 </p></li><li><p> 在同一个查询中可以使用多次 </p></li><li><p> 他们可读性好 </p></li></ul></div><pre class="programlisting">//named parameter (preferred)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="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="manipulatingdata-scrolling"></a>9.3.3. 可滚动迭代(Scrollable iteration)</h3></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) );}</pre><p> <tt class="literal">scroll()</tt>的行为方式与<tt class="literal">iterate()</tt>很类似,除了对象可以有选择的用<tt class="literal">get(int)</tt>初始化,而非整个行都一次性被初始化。 </p></div><div class="sect2" lang="zh-cn"><div class="titlepage"><div><div><h3 class="title"><a name="manipulatingdata-filtering"></a>9.3.4. 过滤集合类(Filtering collections)</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.filter( pk.getKittens(), "where this.color = ?", Color.BLACK, Hibernate.enum(Color.class));</pre><p> 返回的集合被认为是一个包(bag)。 </p><p> 请注意filter并不需要<tt class="literal">from</tt> 子句(当然需要的话它们也可以加上)。Filter不限定返回它们自己的集合元素。 </p><pre class="programlisting">Collection blackKittenMates = session.filter(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -