📄 queryhql.html
字号:
而且否定的格式也可以如下书写: </p><pre class="programlisting">from DomesticCat cat where cat.name not between 'A' and 'B'</pre><pre class="programlisting">from DomesticCat cat where cat.name not in ( 'Foo', 'Bar', 'Baz' )</pre><p> 同样, 子句<tt class="literal">is null</tt>与<tt class="literal">is not null</tt>可以被用来测试空值(null). </p><p> 在Hibernate配置文件中声明HQL“查询替代(query substitutions)”之后, 布尔表达式(Booleans)可以在其他表达式中轻松的使用: </p><pre class="programlisting"><property name="hibernate.query.substitutions">true 1, false 0</property></pre><p> 系统将该HQL转换为SQL语句时,该设置表明将用字符 <tt class="literal">1</tt> 和 <tt class="literal">0</tt> 来 取代关键字<tt class="literal">true</tt> 和 <tt class="literal">false</tt>: </p><pre class="programlisting">from Cat cat where cat.alive = true</pre><p> 你可以用特殊属性<tt class="literal">size</tt>, 或是特殊函数<tt class="literal">size()</tt>测试一个集合的大小。 </p><pre class="programlisting">from Cat cat where cat.kittens.size > 0</pre><pre class="programlisting">from Cat cat where size(cat.kittens) > 0</pre><p> 对于索引了(有序)的集合,你可以使用<tt class="literal">minindex</tt> 与 <tt class="literal">maxindex</tt>函数来引用到最小与最大的索引序数。 同理,你可以使用<tt class="literal">minelement</tt> 与 <tt class="literal">maxelement</tt>函数来 引用到一个基本数据类型的集合中最小与最大的元素。 </p><pre class="programlisting">from Calendar cal where maxelement(cal.holidays) > current date</pre><pre class="programlisting">from Order order where maxindex(order.items) > 100</pre><pre class="programlisting">from Order order where minelement(order.items) > 10000</pre><p>在传递一个集合的索引集或者是元素集(<tt class="literal">elements</tt>与<tt class="literal">indices</tt> 函数) 或者传递一个子查询的结果的时候,可以使用SQL函数<tt class="literal">any, some, all, exists, in</tt> </p><pre class="programlisting">select mother from Cat as mother, Cat as kitwhere kit in elements(foo.kittens)</pre><pre class="programlisting">select p from NameList list, Person pwhere p.name = some elements(list.names)</pre><pre class="programlisting">from Cat cat where exists elements(cat.kittens)</pre><pre class="programlisting">from Player p where 3 > all elements(p.scores)</pre><pre class="programlisting">from Show show where 'fizard' in indices(show.acts)</pre><p> 注意,在Hibernate3种,这些结构变量- <tt class="literal">size</tt>, <tt class="literal">elements</tt>, <tt class="literal">indices</tt>, <tt class="literal">minindex</tt>, <tt class="literal">maxindex</tt>, <tt class="literal">minelement</tt>, <tt class="literal">maxelement</tt> - 只能在where子句中使用。 </p><p> 一个被索引过的(有序的)集合的元素(arrays, lists, maps)可以在其他索引中被引用(只能在where子句中): </p><pre class="programlisting">from Order order where order.items[0].id = 1234</pre><pre class="programlisting">select person from Person person, Calendar calendarwhere calendar.holidays['national day'] = person.birthDay and person.nationality.calendar = calendar</pre><pre class="programlisting">select item from Item item, Order orderwhere order.items[ order.deliveredItemIndices[0] ] = item and order.id = 11</pre><pre class="programlisting">select item from Item item, Order orderwhere order.items[ maxindex(order.items) ] = item and order.id = 11</pre><p> 在<tt class="literal">[]</tt>中的表达式甚至可以是一个算数表达式。 </p><pre class="programlisting">select item from Item item, Order orderwhere order.items[ size(order.items) - 1 ] = item</pre><p> 对于一个一对多的关联(one-to-many association)或是值的集合中的元素, HQL也提供内建的<tt class="literal">index()</tt>函数, </p><pre class="programlisting">select item, index(item) from Order order join order.items itemwhere index(item) < 5</pre><p> 如果底层数据库支持标量的SQL函数,它们也可以被使用 </p><pre class="programlisting">from DomesticCat cat where upper(cat.name) like 'FRI%'</pre><p> 如果你还不能对所有的这些深信不疑,想想下面的查询。如果使用SQL,语句长度会增长多少,可读性会下降多少: </p><pre class="programlisting">select custfrom Product prod, Store store inner join store.customers custwhere prod.name = 'widget' and store.location.name in ( 'Melbourne', 'Sydney' ) and prod = all elements(cust.currentOrder.lineItems)</pre><p> <span class="emphasis"><em>提示:</em></span> 会像如下的语句 </p><pre class="programlisting">SELECT cust.name, cust.address, cust.phone, cust.id, cust.current_orderFROM customers cust, stores store, locations loc, store_customers sc, product prodWHERE prod.name = 'widget' AND store.loc_id = loc.id AND loc.name IN ( 'Melbourne', 'Sydney' ) AND sc.store_id = store.id AND sc.cust_id = cust.id AND prod.id = ALL( SELECT item.prod_id FROM line_items item, orders o WHERE item.order_id = o.id AND cust.current_order = o.id )</pre></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="queryhql-ordering"></a>15.9. order by子句</h2></div></div><div></div></div><p> 查询返回的列表(list)可以按照一个返回的类或组件(components)中的任何属性(property)进行排序: </p><pre class="programlisting">from DomesticCat catorder by cat.name asc, cat.weight desc, cat.birthdate</pre><p> 可选的<tt class="literal">asc</tt>或<tt class="literal">desc</tt>关键字指明了按照升序或降序进行排序. </p></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="queryhql-grouping"></a>15.10. group by子句</h2></div></div><div></div></div><p> 一个返回聚集值(aggregate values)的查询可以按照一个返回的类或组件(components)中的任何属性(property)进行分组: </p><pre class="programlisting">select cat.color, sum(cat.weight), count(cat) from Cat catgroup by cat.color</pre><pre class="programlisting">select foo.id, avg(name), max(name) from Foo foo join foo.names namegroup by foo.id</pre><p> <tt class="literal">having</tt>子句在这里也允许使用. </p><pre class="programlisting">select cat.color, sum(cat.weight), count(cat) from Cat catgroup by cat.color having cat.color in (eg.Color.TABBY, eg.Color.BLACK)</pre><p> 如果底层的数据库支持的话(例如不能在MySQL中使用),SQL的一般函数与聚集函数也可以出现 在<tt class="literal">having</tt>与<tt class="literal">order by</tt> 子句中。 </p><pre class="programlisting">select catfrom Cat cat join cat.kittens kittengroup by cathaving avg(kitten.weight) > 100order by count(kitten) asc, sum(kitten.weight) desc</pre><p> 注意<tt class="literal">group by</tt>子句与 <tt class="literal">order by</tt>子句中都不能包含算术表达式(arithmetic expressions). </p></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="queryhql-subqueries"></a>15.11. 子查询</h2></div></div><div></div></div><p> 对于支持子查询的数据库,Hibernate支持在查询中使用子查询。一个子查询必须被圆括号包围起来(经常是SQL聚集函数的圆括号)。 甚至相互关联的子查询(引用到外部查询中的别名的子查询)也是允许的。 </p><pre class="programlisting">from Cat as fatcat where fatcat.weight > ( select avg(cat.weight) from DomesticCat cat )</pre><pre class="programlisting">from DomesticCat as cat where cat.name = some ( select name.nickName from Name as name )</pre><pre class="programlisting">from Cat as cat where not exists ( from Cat as mate where mate.mate = cat )</pre><pre class="programlisting">from DomesticCat as cat where cat.name not in ( select name.nickName from Name as name )</pre><p> 在select列表中包含一个表达式以上的子查询,你可以使用一个元组构造符(tuple constructors): </p><pre class="programlisting">from Cat as cat where not ( cat.name, cat.color ) in ( select cat.name, cat.color from DomesticCat cat )</pre><p> 注意在某些数据库中(不包括Oracle与HSQL),你也可以在其他语境中使用元组构造符, 比如查询用户类型的组件与组合: </p><pre class="programlisting">from Person where name = ('Gavin', 'A', 'King')</pre><p> 该查询等价于更复杂的: </p><pre class="programlisting">from Person where name.first = 'Gavin' and name.initial = 'A' and name.last = 'King')</pre><p> 有两个很好的理由使你不应当作这样的事情:首先,它不完全适用于各个数据库平台;其次,查询现在依赖于映射文件中属性的顺序。 </p></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="queryhql-examples"></a>15.12. HQL示例</h2></div></div><div></div></div><p> Hibernate查询可以非常的强大与复杂。实际上,Hibernate的一个主要卖点就是查询语句的威力。这里有一些例子,它们与我在最近的 一个项目中使用的查询非常相似。注意你能用到的大多数查询比这些要简单的多!
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -