1、HQL语句的功能非常丰富,where子句后支持的运算符,不仅包括SQL的运算符,也包括EJB-QL的运算符等。where子句中允许使用大部分SQL支持的表达式,包括如下种类:
(1)字符串连接:如value1||value2,或使用字符串连接函数concat(value1, value2)
(2)简单的case,case…when…then…else…end和case,case when…then…else…end等。
(3)时间操作函数:current_date()、current_time、year()等。
(4)EJB-QL3.0的函数:substring()、trim()、abs()、sqrt()等。
(5)可在where子句中使用SQL常量。
(6)在HQL语句中使用Java中的public static final类型的常量,例如Color.RED
(7)HQL语句支持使用英文问号(?)作为参数占位符,这与JDBC的参数占位符一致;也使用命名参数占位符号,方法在参数名前加英文冒号(:),例如:start_date等。
(8)如果底层数据库支持单行函数,则HQL语句也完全可以支持。
(9)支持数据库的类型转换函数,如cast(… as …),第二个参数是Hibernate的类型名,或者extract(… from ,,,),前提是底层数据库支持ANSI cast()和extract()。
2、如果在Hibernate配置文件中进行如下声明:
<property name=”hibernate.query.substitutions”>true 1,false 0</property>
上面的声明表明:HQL转换SQL语句时,将使用字符1和0来取代关键字true和false,然后将可以在表达式中使用布尔表达式。
3、有用的elements()和indices函数,用于返回指定集合的所有元素和所有索引。
4、在where子句中,有序集合(数组、List集合、Map对象)的元素可以通过【】运算符来访问。如下:
from Order order where order.items[0].id=1234
在【】中的表达式甚至可以是一个算式表达式。
5、结构变量:size、elements、indices等,只能在where子句中使用。