`
ZhouGang库鲁卡
  • 浏览: 30495 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

(转)HQL语法

 
阅读更多
 
 

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

 

 

 

 

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

还不

 

能与独立的

 

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) 

 

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 

 

 

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简介 HQL(Hibernate Query Language)是一种面向对象的查询语言,被广泛应用于Hibernate框架中,用于执行数据持久化操作。与传统的SQL相比,HQL更加面向对象,支持诸如...

    HQL语法入门学习HQL语法入门学习

    在深入探讨HQL语法之前,我们首先需要理解什么是HQL。HQL,全称为Hibernate Query Language,是Hibernate框架提供的一种面向对象的查询语言。与SQL(Structured Query Language)不同,HQL是专为ORM(Object-...

    Hibernate hql查询语法总结

    《Hibernate HQL查询语法详解》 Hibernate,作为Java领域中广泛应用的对象关系映射(ORM)框架,极大地简化了数据库操作。其内置的HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以类和...

    HQL语句的语法

    HQL语句的语法结构与SQL相似,但更注重对象和类的概念。以下将详细介绍HQL语句的几个关键部分: 1. **from 子句**:这是HQL查询的起点,用于指定要查询的持久化类。例如,`from Person as p`表示从`Person`类中选择...

    HQL 语法总结 实体查询

    ### HQL语法总结:实体查询详解 #### 一、实体查询概述 HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以一种类似于SQL但更接近于面向对象的方式来编写查询。本文将详细介绍HQL中的实体...

    J2EE HQL语法大全

    **J2EE HQL语法大全** 在Java企业级开发中,J2EE(Java 2 Platform, Enterprise Edition)是广泛采用的技术平台,它提供了一整套标准和框架,用于构建可扩展、分布式的企业级应用程序。在J2EE环境中,Hibernate作为...

    HQL查询及语法

    2. **编写HQL语句**:根据需求构建HQL查询语句,这一步骤需要熟悉HQL语法结构。 3. **创建Query对象**:利用Session对象的`createQuery`方法,传入HQL语句创建Query实例。 4. **设置参数**:如果HQL语句中包含...

    强烈建议的HQL语法规则详解

    2. **编写HQL语句**:HQL的语法类似于SQL,但更注重对象。例如,`from Person p where p.myEvents.title = :eventTitle`这样的查询语句会找出所有`myEvents`标题为`eventTitle`的`Person`对象。 3. **创建Query对象*...

    hql语句语法详解hql语句

    ### HQL语句语法详解 HQL(Hibernate Query Language)是一种面向对象的查询语言,它提供了灵活而强大的机制来查询数据库中的数据,并将其映射到Java对象上。本篇文章将根据给定的信息深入探讨HQL的基本语法结构...

    hql查询语言语法

    #### 四、HQL语法详解 接下来,我们将详细介绍HQL的一些关键语法。 ##### 1. `from`子句 - **基本格式**:`from [类名] [别名]` - **示例**:`from Person p`,表示从`Person`类中选取所有的实例。 - **扩展**:...

    Spring中常用的hql查询方法

    ### Spring框架中HQL查询方法详解 在Spring框架与Hibernate技术结合使用时,HQL(Hibernate Query Language)作为对象查询语言被广泛应用于数据查询操作之中。本文将详细解析Spring框架中常用的HQL查询方法及其应用...

    Hibernate查询语言(HQL) 语法参考

    Hibernate 查询语言(HQL)语法参考 HQL(Hibernate Query Language)是 Hibernate 框架中的一种强大的查询语言,它类似于 SQL 语句,但是它是完全面向对象的查询语言,可以理解继承、多态和关联等概念。 大小写...

    HQL Eclipse Plugins 配置教程

    不喜欢使用myEclipse的朋友可以尝试下 最近在项目中使用Hibernate,由于需要使用HQL,找了很多资料,大都是MyEclipse中自带的HQL工具。...工具很好用,可以识别出HQL文的语法正确,并且解析为标准SQL语句。

    Hibernate的HQL查询

    hibernate hql 语法学习的文档

    精通HQL(word格式)

    同样,对于多对一、一对多、多对多的关系,HQL也能提供简洁的查询语法。 【默认数据库表和数据】 在学习HQL时,通常会基于一个预先设定的数据库环境。在这个例子中,使用了一个名为joblog的数据库,包含三个表:...

    Hibernate教程(数据查询)HQL,PDF格式

    这条语句使用HQL语法查询了所有的`User`对象。`find`方法是`Session`接口的一个快捷方法,用于执行HQL查询。这里,查询字符串"from User"告诉Hibernate检索`User`类的所有实例。 #### HQL查询的灵活性 HQL不仅支持...

    HQL查询pdf资料

    #### HQL基本语法 HQL查询的基本结构包括关键字如`SELECT`、`FROM`、`WHERE`、`GROUP BY`、`HAVING`、`ORDER BY`等,这些关键字的使用与SQL非常相似,但是HQL还支持面向对象的特性,如属性路径表达式。 ##### 实体...

    hql语句 使用大全

    ### HQL语句使用大全 HQL(Hibernate Query Language)是一种...以上介绍了HQL的基础语法及常用操作,HQL的强大之处在于其灵活性和易用性,掌握了这些基本用法后,开发人员可以根据具体需求编写出更复杂的查询语句。

Global site tag (gtag.js) - Google Analytics