4.6.1 HQL 查询(3)
6. 表达式
HQL 的功能非常丰富,其where 子句后支持的运算符异常丰富,不仅包括SQL 的运算符,也包括EJB-QL的运算符等。
where子句中允许使用大部分SQL支持的表达式。
数学运算符+,-, *,1 等。
二进制比较运算符=,>=,<=,<>, !=, like 等。
逻辑运算符 and,or,not 等。
in, not in, between, is nul, is not null, is empty, is not empty, member of and notmemberof等。
简单的 case,case ... when... then... else ... end 和 case, casewhen ... then... else .end 等。
字符串连接符 valuel// value2 或者使用字符串连接函数 concat(valuel ,value2)。
时间操作函数:currencdateO,currenCtimeO,currenctimestampO,secondO,minuteO,hourO,dayO,monthO,ye缸o等。
HQL还支持 EJB-QL3.0 所支持的函数或操作: substringO,trimO,10werO,upperO,leng由0,10cateO,absO,sqrtO,biCleng由0, coalesceO 和 nullif()等。
还支持数据库的类型转换函数,如 cast(...as ..小第二个参数是 Hibernate 的类型名,或者 extract(...from ...),前提是底层数据库支持ANSI castO 和 extractO。如果底层数据库支持单行函数:signO,truncO,rtrimO, sin()。则 HQL 语句也完全可以支持。
HQL 语句支持使用"?"作为参数占位符,这与 JDBC 的参数占位符一致,也可使用命名参数占位符号,方法是在参数名前加冒号":",如 :start_date, :xl 等。也可在 where 子句中使用 SQL 常量,如'foo',69, '1970-01-0110:∞:01.0'等。还可以在 HQL 语句中使用 Javapublic static final 类型的常量,如eg.Color.TABBY。
除此之外, where 子句还支持如下的特殊关键字用法。
in 与 between...and 可按如下方法使用:
from DomesticCat cat where cat.name between |
当然,也支持 notin 和 not between...and 的使用,例如:
from DomesticCat cat where cat.name not between 'A' and 'B' |
子句 is null 与 isnotnull 可以被用来测试空值,例如:
from DomesticCat cat where cat.name is null; |
如果在Hibernate配置文件中使用,必须进行如下声明:
<propertyname="hibernate.query. |
from Cat cat where cat.alive = true |
from Cat cat wherecat.kittens.size> |
from Calendar cal where maxelement(cal.holidays) > |
//操作集合元素 |
注意,在这些结构变量中:size, elements, indices, minindex, maxindex, minelement,maxelement 等,只能在 where 子句中使用。
在 where 子句中,有序集合的元素(arrays,lists,maps)可以通过[ ]运算符访问。
例如:
Ilitems 是有序集合属性. items[O]代表第一个元素 |
select item from Item item, Order orderwhere |
select custfrom Product prod,Store store |
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.idAND loc.name IN ( 'Melbourne',
'Sydney' )AND sc.store id = store.idAND sc.cust
id = cust.idAND prod.id = ALL{SELECT item.
prod_idFROM line_items item, orders0
WHERE item.order id = o.idAND cust.current ord
er = o.id