1
Hibernate
配备了一种非常强大的查询语言,这种语言看上去很像SQ。但是不要被语法结构上的相似所迷惑,HQL是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态和关联之类的概念。
1.1.
大小写敏感性问题
除了Java类与属性的名称外,查询语句对大小写并不敏感。所以SeLeCT 与sELEct 以及SELECT 是相同的,但是
org.hibernate.eg.FOO 并不等价于org.hibernate.eg.Foo 并且foo.barSet 也不等价于foo.BARSET。
本手册中的
HQL
关键字将使用小写字母
.
很多用户发现使用完全大写的关键字会使查询语
句
的可读性更强
,
但我们发现,
当把查询语句嵌入到
Java
语句中的时候使用大写关键字比
较难看。
14.2. from
子句
Hibernate
中最简单的查询语句的形式如下:
from eg.Cat
该子句简单的返回
eg.Cat
类的所有实例。
通常我们不需要使用类的全限定名
,
因为
auto-import
(自动引入)
是缺省的情况。
所以我们几乎只使用如下的简单写法:
from Cat
大多数情况下
,
你需要指定一个别名
,
原因是你可能需要
在查询语句的其它部分引用到
Cat
from Cat as cat
这个语句把别名
cat
指定给类
Cat
的实例
,
这样我们就可以在随后的查询中使用此别名了。
关键字
as
是可选的,我们也可以这样写
:
from Cat cat
子句中可以同时出现多个类
,
其查询结果是产生一个笛卡儿积或产生跨表的连接。
from Formula, Parameter
from Formula as form, Parameter as param
查询语句中别名的开头部分小写被认为是实践中的好习惯,
这样做与
Java
变量的命名标
准保持了一致
(
比如,
domesticCat)
。
14.3.
关联
(Association)
与连接
(Join)
我们也可以为相关联的实体甚至是对一个集合中的全部元素指定一个别名
,
这时要使用关
键字
join
。
2
from Cat as cat
inner join cat.mate as mate
left outer join cat.kittens as kitten
from Cat as cat left join cat.mate.kittens as kittens
from Formula form full join form.parameter param
受支持的连接类型是从
ANSI SQL
中借鉴来的。
inner join
(内连接)
left outer join
(左外连接)
right outer join
(右外连接)
full join (
全连接,并不常用
)
语句
inner join, left outer join
以及
right outer join
可以简写。
from Cat as cat
join cat.mate as mate
left join cat.kittens as kitten
通过
HQL
的
with
关键字,你可以提供额外的
join
条件。
from Cat as cat
left join cat.kittens as kitten
with kitten.bodyWeight > 10.0
还有,
一个
"fetch"
连接允许仅仅使用一个选择语句就将相关联的对象或一组值的集合随着他
们的父对象的初始化而被初始化,
这种方法在使用到集合的情况下尤其有用,
对于关联和集
合来说,它有效的代替了映射文件中的外联接
与延迟声明(
lazy
declarations
)
.
查看
第
19.1
节
“
抓取策略
(Fetching strategies)
”
以获得等多的信息。
from Cat as cat
inner join fetch cat.mate
left join fetch cat.kittens
一个
fetch
连接通常不需要被指定别名
,
因为相关联的对象不应当被用在
where
子句
(
或
其它任何子句
)
中。同时,相关联的对象
并不在查询的结果中直接返回,但可以通过他们的
父对象来访问到他们。
from Cat as cat
inner join fetch cat.mate
left join fetch cat.kittens child
left join fetch child.kittens
假若使用
iterate()
来调用查询,
请注意
fetch
构造是不能使用的
(scroll()
可以使用
)
。
fetch
也
不应该与
setMaxResults()
或
setFirstResult()
共用,
这是因为这些操作是基于结果集的,
而
在预先抓取集合类时可能包含重复的数据,也就是说无法预先知道精确的行数。
fetch
还不
3
能与独立的
with
条件一起使用。通过在一次查询中
fetch
多个集合,可以制造出笛卡尔积,
因此请多加注意。对
bag
映射来说,同时
join fetch
多个集合角色可能在某些情况下给出并
非预期的结果,也请小心。最后注意,使用
full join fetch
与
right join fetch
是没有意义的。
如果你使用属性级别的延迟获取(
lazy fetching
)
(这是通过重新编写字节码实现的)
,可以
使用
fetch all properties
来强制
Hibernate
立即取得那些原本需要延迟加载的属性
(在第一
个查询中)
。
from Document fetch all properties order by name
from Document doc fetch all properties where lower(doc.name) like '%cats%'
14.4. join
语法的形式
HQL
支持两种关联
join
的形式:
implicit(
隐式
)
与
explicit
(显式)
。
上一节中给出的查询都是使用
explicit(
显式
)
形式的,其中
form
子句中明确给出了
join
关键
字。这是建议使用的方式。
implicit
(隐式)形式不使用
join
关键字。关联使用
"
点号
"
来进行“引用”
。
implicit join
可以
在任何
HQL
子句中出现
.implicit join
在最终的
SQL
语句中以
inner join
的方式出现。
from Cat as cat where cat.mate.name like '%s%'
14.5. select
子句
select
子句选择将哪些对象与属性返
回到查询结果集中
.
考虑如下情况
:
select mate
from Cat as cat
inner join cat.mate as mate
该语句将选择
mates of other Cats
。
(其他猫的配偶)
实际上
,
你可以更简洁的用以下的查
询语句表达相同的含义
:
select cat.mate from Cat cat
查询语句可以返回值为任何类型的属性,包括返回类型为某种组件
(Component)
的属性
:
select cat.name from DomesticCat cat
where cat.name like 'fri%'
select cust.name.firstName from Customer as cust
查询语句可以返回多个对象和(或)属性,存放在
Object[]
队列中
,
select mother, offspr, mate.name
from DomesticCat as mother
inner join mother.mate as mate
left outer join mother.kittens as offspr
或存放在一个
List
对象中
,
select new list(mother, offspr, mate.name)
4
from DomesticCat as mother
inner join mother.mate as mate
left outer join mother.kittens as offspr
也可能直接返回一个实际的类型安全的
Java
对象
,
select new Family(mother, mate, offspr)
from DomesticCat as mother
join mother.mate as mate
left join mother.kittens as offspr
假设类
Family
有一个合适的构造函数
.
你可以使用关键字
as
给“被选择了的表达式”指派别名
:
select max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n
from Cat cat
这种做法在与子句
select new map
一起使用时最有用
:
select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n )
from Cat cat
该查询返回了一个
Map
的对象,内容是别名与被选择的值组成的名
-
值映射。
14.6.
聚集函数
HQL
查询甚至可以返回作用于属性之上的聚集函数的计算结果
:
select avg(cat.weight), sum(cat.weight), max(cat.weight), count(cat)
from Cat cat
受支持的聚集函数如下:
avg(...), sum(...), min(...), max(...)
count(*)
count(...), count(distinct ...), count(all...)
你可以在选择子句中使用数学操作符、连接以及经过验证的
SQL
函数:
select cat.weight + sum(kitten.weight)
from Cat cat
join cat.kittens kitten
group by cat.id, cat.weight
select firstName||' '||initial||' '||upper(lastName) from Person
关键字
distinct
与
all
也可以使用,它们具有与
SQL
相同的语义
.
select distinct cat.name from Cat cat
5
select count(distinct cat.name), count(cat) from Cat cat
14.7.
多态查询
一个如下的查询语句
:
from Cat as cat
不仅返回
Cat
类的实例
,
也同时返回子类
DomesticCat
的实例
.
Hibernate
可以在
from
子
句中指定任何
Java
类或接口
.
查询会返回继承了该类的所有持久化子类
的实例或返回声
明了该接口的所有持久化类的实例。下面的查询语句返回所有的被持久化的对象:
from java.lang.Object o
接口
Named
可能被各种各样的持久化类声明:
from Named n, Named m where n.name = m.name
注意,最后的两个查询将需要超过一个的
SQL
SELECT.
这表明
order
by
子句
没有对整个
结果集进行正确的排序
. (
这也说明你不能对这样的查询使用
Query.scroll()
方法
.)
14.8. where
子句
where
子句允许你将返回的实例列表的范围缩小
.
如果没有指定别名,
你可以使用属性名来
直接引用属性
:
from Cat where name='Fritz'
如果指派了别名,需要使用完整的属性名
:
from Cat as cat where cat.name='Fritz'
返回名为(属性
name
等于)
'Fritz'
的
Cat
类的实例。
select foo
from Foo foo, Bar bar
where foo.startDate = bar.date
将返回所有满足下面条件的
Foo
类的实例:
存在如下的
bar
的一个实例,其
date
属性等
于
Foo
的
startDate
属性。
复合路径表达式使得
where
子句非常的强大,考虑如下情况:
from Cat cat where cat.mate.name is not null
该查询将被翻译成为一个含有表连接(内连接)的
SQL
查询。如果你打算写像这样的查询
语句
from Foo foo
where foo.bar.baz.customer.address.city is not null
在
SQL
中,你为达此目的将需要进行一个四表连接的查询。
=
运算符不仅可以被用来比较属性的值,也可以用来比较实例:
from Cat cat, Cat rival where cat.mate = rival.mate
相关推荐
### HQL语法详解及其应用案例 #### 一、HQL简介 HQL(Hibernate Query Language)是一种面向对象的查询语言,被广泛应用于Hibernate框架中,用于执行数据持久化操作。与传统的SQL相比,HQL更加面向对象,支持诸如...
在深入探讨HQL语法之前,我们首先需要理解什么是HQL。HQL,全称为Hibernate Query Language,是Hibernate框架提供的一种面向对象的查询语言。与SQL(Structured Query Language)不同,HQL是专为ORM(Object-...
《Hibernate HQL查询语法详解》 Hibernate,作为Java领域中广泛应用的对象关系映射(ORM)框架,极大地简化了数据库操作。其内置的HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以类和...
HQL语句的语法结构与SQL相似,但更注重对象和类的概念。以下将详细介绍HQL语句的几个关键部分: 1. **from 子句**:这是HQL查询的起点,用于指定要查询的持久化类。例如,`from Person as p`表示从`Person`类中选择...
### HQL语法总结:实体查询详解 #### 一、实体查询概述 HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以一种类似于SQL但更接近于面向对象的方式来编写查询。本文将详细介绍HQL中的实体...
**J2EE HQL语法大全** 在Java企业级开发中,J2EE(Java 2 Platform, Enterprise Edition)是广泛采用的技术平台,它提供了一整套标准和框架,用于构建可扩展、分布式的企业级应用程序。在J2EE环境中,Hibernate作为...
2. **编写HQL语句**:根据需求构建HQL查询语句,这一步骤需要熟悉HQL语法结构。 3. **创建Query对象**:利用Session对象的`createQuery`方法,传入HQL语句创建Query实例。 4. **设置参数**:如果HQL语句中包含...
2. **编写HQL语句**:HQL的语法类似于SQL,但更注重对象。例如,`from Person p where p.myEvents.title = :eventTitle`这样的查询语句会找出所有`myEvents`标题为`eventTitle`的`Person`对象。 3. **创建Query对象*...
### HQL语句语法详解 HQL(Hibernate Query Language)是一种面向对象的查询语言,它提供了灵活而强大的机制来查询数据库中的数据,并将其映射到Java对象上。本篇文章将根据给定的信息深入探讨HQL的基本语法结构...
#### 四、HQL语法详解 接下来,我们将详细介绍HQL的一些关键语法。 ##### 1. `from`子句 - **基本格式**:`from [类名] [别名]` - **示例**:`from Person p`,表示从`Person`类中选取所有的实例。 - **扩展**:...
### Spring框架中HQL查询方法详解 在Spring框架与Hibernate技术结合使用时,HQL(Hibernate Query Language)作为对象查询语言被广泛应用于数据查询操作之中。本文将详细解析Spring框架中常用的HQL查询方法及其应用...
Hibernate 查询语言(HQL)语法参考 HQL(Hibernate Query Language)是 Hibernate 框架中的一种强大的查询语言,它类似于 SQL 语句,但是它是完全面向对象的查询语言,可以理解继承、多态和关联等概念。 大小写...
不喜欢使用myEclipse的朋友可以尝试下 最近在项目中使用Hibernate,由于需要使用HQL,找了很多资料,大都是MyEclipse中自带的HQL工具。...工具很好用,可以识别出HQL文的语法正确,并且解析为标准SQL语句。
hibernate hql 语法学习的文档
同样,对于多对一、一对多、多对多的关系,HQL也能提供简洁的查询语法。 【默认数据库表和数据】 在学习HQL时,通常会基于一个预先设定的数据库环境。在这个例子中,使用了一个名为joblog的数据库,包含三个表:...
这条语句使用HQL语法查询了所有的`User`对象。`find`方法是`Session`接口的一个快捷方法,用于执行HQL查询。这里,查询字符串"from User"告诉Hibernate检索`User`类的所有实例。 #### HQL查询的灵活性 HQL不仅支持...
#### HQL基本语法 HQL查询的基本结构包括关键字如`SELECT`、`FROM`、`WHERE`、`GROUP BY`、`HAVING`、`ORDER BY`等,这些关键字的使用与SQL非常相似,但是HQL还支持面向对象的特性,如属性路径表达式。 ##### 实体...
### HQL语句使用大全 HQL(Hibernate Query Language)是一种...以上介绍了HQL的基础语法及常用操作,HQL的强大之处在于其灵活性和易用性,掌握了这些基本用法后,开发人员可以根据具体需求编写出更复杂的查询语句。