📄 queryhql.html
字号:
</p></div><div class="sect1" lang="zh-cn"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="queryhql-expressions"></a>14.9. 表达式</h2></div></div><div></div></div><p> 在<tt class="literal">where</tt>子句中允许使用的表达式包括 大多数你可以在SQL使用的表达式种类: </p><div class="itemizedlist"><ul type="disc" compact><li><p> 数学运算符<tt class="literal">+, -, *, /</tt> </p></li><li><p> 二进制比较运算符<tt class="literal">=, >=, <=, <>, !=, like</tt> </p></li><li><p> 逻辑运算符<tt class="literal">and, or, not</tt> </p></li><li><p> <tt class="literal">in</tt>, <tt class="literal">not in</tt>, <tt class="literal">between</tt>, <tt class="literal">is null</tt>, <tt class="literal">is not null</tt>, <tt class="literal">is empty</tt>, <tt class="literal">is not empty</tt>, <tt class="literal">member of</tt> and <tt class="literal">not member of</tt> </p></li><li><p> "简单的" case, <tt class="literal">case ... when ... then ... else ... end</tt>,和 "搜索" case, <tt class="literal">case when ... then ... else ... end</tt> </p></li><li><p> 字符串连接符<tt class="literal">...||...</tt> or <tt class="literal">concat(...,...)</tt> </p></li><li><p> <tt class="literal">current_date()</tt>, <tt class="literal">current_time()</tt>, <tt class="literal">current_timestamp()</tt> </p></li><li><p> <tt class="literal">second(...)</tt>, <tt class="literal">minute(...)</tt>, <tt class="literal">hour(...)</tt>, <tt class="literal">day(...)</tt>, <tt class="literal">month(...)</tt>, <tt class="literal">year(...)</tt>, </p></li><li><p> EJB-QL 3.0定义的任何函数或操作:<tt class="literal">substring(), trim(), lower(), upper(), length(), locate(), abs(), sqrt(), bit_length(), mod()</tt> </p></li><li><p> <tt class="literal">coalesce()</tt> 和 <tt class="literal">nullif()</tt> </p></li><li><p> <tt class="literal">str()</tt> 把数字或者时间值转换为可读的字符串 </p></li><li><p> <tt class="literal">cast(... as ...)</tt>, 其第二个参数是某Hibernate类型的名字,以及<tt class="literal">extract(... from ...)</tt>,只要ANSI <tt class="literal">cast()</tt> 和 <tt class="literal">extract()</tt> 被底层数据库支持 </p></li><li><p> HQL <tt class="literal">index()</tt> 函数,作用于join的有序集合的别名。 </p></li><li><p> HQL函数,把集合作为参数:<tt class="literal">size(), minelement(), maxelement(), minindex(), maxindex()</tt>,还有特别的<tt class="literal">elements()</tt> 和<tt class="literal">indices</tt>函数,可以与数量词加以限定:<tt class="literal">some, all, exists, any, in</tt>。 </p></li><li><p> 任何数据库支持的SQL标量函数,比如<tt class="literal">sign()</tt>, <tt class="literal">trunc()</tt>, <tt class="literal">rtrim()</tt>, <tt class="literal">sin()</tt> </p></li><li><p> JDBC风格的参数传入 <tt class="literal">?</tt> </p></li><li><p> 命名参数<tt class="literal">:name</tt>, <tt class="literal">:start_date</tt>, <tt class="literal">:x1</tt> </p></li><li><p> SQL 直接常量 <tt class="literal">'foo'</tt>, <tt class="literal">69</tt>, <tt class="literal">6.66E+2</tt>, <tt class="literal">'1970-01-01 10:00:01.0'</tt> </p></li><li><p> Java <tt class="literal">public static final</tt> 类型的常量 <tt class="literal">eg.Color.TABBY</tt> </p></li></ul></div><p> 关键字<tt class="literal">in</tt>与<tt class="literal">between</tt>可按如下方法使用: </p><pre class="programlisting">from DomesticCat cat where cat.name between 'A' and 'B'</pre><pre class="programlisting">from DomesticCat cat where cat.name in ( 'Foo', 'Bar', 'Baz' )</pre><p> 而且否定的格式也可以如下书写: </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>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -