`

Hibernate查询语言:HQL 详解(转载)

阅读更多
HQL:Hibernate Qusery Language,如果你已经熟悉它,就会发现它跟SQL非常相像。不过 你不要被表面的假象迷惑,HQL是面向对象的(OO,用生命的眼光看待每一个对象,他们是如此 鲜活)。如果你对JAVA和SQL语句有一定了解的话,那么HQL对你简直易如反掌,你完全可以利用在公车上的时间掌握它。

以下从几个方面进行慢慢深入:

1。大小些敏感
大家知道Query是对大小写不敏感的,但是在HQL(前面提到它是OO的)中那么对象类的名称和属性确实大小写敏感的(符合java编程语法)。
如:sElect cat.name from Cat as cat和select cat.name from Cat as cat是一样的
但是:
sElect cat.name from CAT as cat和select cat.name from Cat as cat确实不一样的。

2。from语句
最简单的:
from eg.Cat 
它只是简单的返回所有eg.Cat的实例
通常我们此时会为eg.Cat其个别名,因为在query的其余部分可能会用到(参看上边关于大小写
敏感时的例子情形),如:
from eg.Cat as cat 这里as可以省略。
上边只是单表查询,多表的情况如下写法:
from eg.Cat,eg.Dog
from eg.Cat as cat,eg.Dog as dog

3。join相关
(inner) join
left (outer) join
right (outer) join
full join
HQL同样对SQL中的这些特性支持
下面插播一个小话题,关于上边的那些特性,我一直都没怎么用,今天既然说到这里,就想
把上边的几个特性的用法说一下,也算对自己的一个补充:
假设有两个表:部门、员工,下面列举一些数据:
员工(Employee):
ID Name DepNo
001 Jplateau 01
002 Jony 01
003 Camel 02
部门(Department):
ID Name
01 研发部
02 营销部

在Hibernate中我们操纵的都是对象,所以我们操纵的是部门类和员工类
1).(inner) join
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee join Department as department on employee.DepNo=
department.ID (注意到条件语句我用on 没有用where)
那么执行结果是什么呢?
id1 name1 id2 name2
++++++++++++++++++++++++++++++++++++++
001 Jplateau 01 研发部
002 Jony 01 研发部

2).left (outer) join
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee left join Department as department on employee.DepNo=
department.ID 
那么执行结果又该是什么呢?
id1 name1 id2 name2
++++++++++++++++++++++++++++++++++++++
001 Jplateau 01 研发部
002 Jony 01 研发部 
003 Camel null null 
{就是说此时我要已第一个表的记录多少为准,第二个表中没有相应纪录的时候填充null} 
3). right (outer) join
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee right join Department as department on employee.DepNo=
department.ID 
那么执行结果又该是什么呢?
id1 name1 id2 name2
++++++++++++++++++++++++++++++++++++++
001 Jplateau 01 研发部
002 Jony 01 研发部 
null null 02 营销部 
{就是说此时我要已第二个表的记录多少为准,第一个表中没有相应纪录的时候填充null} 

4。select语句
就是要确定你要从查询中返回哪些对象或者哪些对象的属性。写几个例子吧:
select employee form Employee as employee 
select employee form Employee as employee where employee.Name like 'J%'
select employee.Name form Employee as employee where employee.Name like 'J%'
select employee.ID as id1,employee.Name as name1,department.ID as id2,department.Name
as name2 from Employee as employee right join Department as department on employee.DepNo=
department.ID 

select elements(employee.Name) from Employee as employee 
(不明白elements到底是做什么用的?望给于说明) 
等等
5。数学函数
JDO目前好像还不支持此类特性。
avg(...), sum(...), min(...), max(...) 

count(*) 

count(...), count(distinct ...), count(all...) 

其用法和SQL基本相同

select distinct employee.name from Employee as employee 
select count(distinct employee.name),count(employee) from Employee as employee 

6。polymorphism (暂时不知道如何解释?)
from com.test.Animal as animal
不光得到所有Animal得实例,而且可以得到所有Animal的子类(如果我们定义了一个子类Cat)
一个比较极端的例子
from java.lang.Object as o
可以得到所有持久类的实例

7。where语句
定义查询语句的条件,举几个例子吧:
from Employee as employee where employee.Name='Jplateau'
from Employee as employee where employee.Name like 'J%'
from Employee as employee where employee.Name like '%u'
在where语句中“=”不光可以比较对象的属性,也可以比较对象,如:
select animal from com.test.Animal as animal where animal.name=dog

8。表达式

在SQL语句中大部分的表达式在HQL中都可以使用:
mathematical operators +, -, *, / 

binary comparison operators =, >=, <=, <>, !=, like 

logical operations and, or, not 

string concatenation || 

SQL scalar functions like upper() and lower() 

Parentheses ( ) indicate grouping 

in, between, is null 

JDBC IN parameters ? 

named parameters :name, :start_date, :x1 (这种应该是另一种"?"的变通解决方法)

SQL literals 'foo', 69, '1970-01-01 10:00:01.0' 

Java public static final constants eg.Color.TABBY 

其他不必解释了,在这里我只想对查询中的参数问题说明一下:
大家知道在SQL中进行传递参数进行查询的时候,我们通常用PreparedStatement,在语句中写一大堆的“?”,
在hql中也可以用这种方法,如:
List mates = sess.find(
"select employee.name from Employee as employee " +
"where employee.Name=? ",
name,
Hibernate.STRING
);
(说明:上面利用Session里的find方法,在hibernate的api Session中重载了很多find方法,它可以满足你多种形式的查询)
上边是一个参数的情形,这种情况下紧接着引入参数和定义参数的类型,当为多个参数,调用另一个find方法,它的后两个
参数都是数组的形式。

还有另外一种方法来解决上边的问题,JDO也有这样的方法,不过和hibernate的表现形式上有差别,但他们两个骨子里却是
一样的,如:
Query q = sess.createQuery("select employee.name from Employee as employee where employee.Name=:name");
q.setString("name", "Jplateau");
//当有多个参数的时候在此逐一定义
Iterator employees = q.iterate(); 

9。order 语句
和sql语句没什么差别,如:
select employee.name from Employee as employee where employee.Name like 'J%' order by employee.ID desc (或者asc)

10。group by 语句
同样和sql语句没什么差别,如:

select employee.name,employee.DepNo from Employee as employee group by employee.DepNo

select foo.id, avg( elements(foo.names) ), max( indices(foo.names) ) from eg.Foo foo group by foo.id
{Note: You may use the elements and indices constructs inside a select clause, even on databases with no subselects.}
谁帮我解释一下上边两句,谢过!

11。子查询
hibernate同样支持子查询,写几个例子:

from eg.Cat as fatcat where fatcat.weight > ( select avg(cat.weight) from eg.DomesticCat cat )

小节:
其实HQL和SQL是非常相似的,在写的时候你只要时刻想到对象的概念,那么你完全可以用SQL的思想来写HQL.

参考资源:Hibernate参考手册第七章以及第九章,建议由时间的并且要用hibernate开发项目的朋友仔细研读该手册。

ezerg 编程小语
 
分享到:
评论

相关推荐

    hibernate查询语言--HQL

    以上就是关于Hibernate查询语言HQL的详解,包括了从简单属性查询到实体对象查询,再到条件查询、原生SQL查询和外置命名查询的使用。通过学习和实践,开发者可以更加熟练地运用Hibernate进行数据库操作。

    Hibernate数据检索(HQL)笔记

    HQL 是一种面向对象的查询语言,它支持 SQL 的大部分功能,并提供了一些面向对象的特性。HQL 查询通常用于检索特定条件下的对象集合或单个对象。 ##### 1. HQL 语法特点: - **面向对象**:HQL 使用类和属性名来...

    Hibernate hql查询语法总结

    其内置的HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者以类和对象的方式进行数据查询。本文将对Hibernate HQL查询语法进行总结,涵盖基础查询、属性查询、实例化查询以及查询链接等多个...

    hibernateHQL关联查询

    其中,HQL(Hibernate Query Language)作为Hibernate提供的查询语言之一,允许开发者以接近面向对象的方式编写查询语句。本文将重点介绍Hibernate中的关联查询,并深入探讨HQL关联查询的实现原理及应用场景。 ####...

    精通Hibernate:Java对象持久化详解.zip

    4. **查询语言(HQL)**:介绍Hibernate查询语言,它是面向对象的查询语言,允许开发者以类和对象的方式编写查询,避免了直接使用SQL。 5. **Criteria查询和Criteria API**:提供了一种比HQL更灵活的查询方式,可以...

    HQL详解

    Hibernate Query Language(HQL)是Hibernate框架中的对象关系映射查询语言,它允许开发者以面向对象的方式书写查询,而无需关心底层数据库的SQL语法。HQL是SQL的一个面向对象的版本,提供了更为简洁且强大的查询...

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

    ### Hibernate教程:数据查询与HQL详解 #### 引言 Hibernate是一款强大的对象关系映射(ORM)框架,它能够将Java对象与数据库表进行映射,极大地简化了数据库操作的复杂度。在数据查询方面,Hibernate提供了多种...

    Hibernate HQL详解.docx

    Hibernate HQL,全称为Hibernate Query Language,是Hibernate框架中用于操作数据库的一种面向对象的查询语言。它允许开发者用面向对象的方式来编写查询语句,极大地提高了开发效率和代码的可读性。以下是对HQL的...

    Hibernate_HQL大全

    HQL,即Hibernate Query Language,是一种强大且面向对象的查询语言,由Hibernate框架提供。尽管HQL的语法结构与SQL相似,但其设计理念完全不同,HQL是专门为面向对象的数据查询而设计的。它能够理解和处理诸如继承...

    hibernate查询详解

    hibernate查询详解 在Java开发中,Hibernate作为一款强大的ORM(Object-Relational Mapping)框架,极大地简化了数据库操作。本文将详细介绍Hibernate的五种查询方式,包括HQL查询、Criteria方法、动态查询...

    Hibernate查询语言

    **Hibernate查询语言(HQL)详解** Hibernate是一个强大的Java对象关系映射(ORM)框架,它简化了在Java应用程序中操作数据库的过程。其中,Hibernate查询语言(HQL)是Hibernate提供的一种面向对象的查询语言,它...

    精通Hibernate:Java对象持久化技术详解.pdf

    Query接口提供了对HQL(Hibernate查询语言)和Criteria API的支持,使得数据库查询更加灵活和强大。 此外,本书还会深入到Hibernate的高级特性,如级联操作、延迟加载、集合映射、多态映射、关联映射(一对一、一对...

    Hibernate HQL.txt

    Hibernate HQL是一种面向对象的查询语言,它允许开发人员以一种更加自然的方式来表达数据库查询,而无需直接编写SQL语句。HQL提供了类似于SQL的强大查询能力,但更符合面向对象编程的思维方式,这使得它在处理持久化...

    hibernateHQL基本查询

    HQL (Hibernate Query Language) 是一种面向对象的查询语言,由 Hibernate 官方提供,用于简化数据库查询过程。与传统的 JDBC 方式相比,使用 HQL 进行数据库查询更加便捷、高效且易于维护。 #### 二、HQL 与 SQL ...

    Hibernate技术详解

    通过本文,我们详细介绍了Hibernate技术及其查询语言HQL的相关知识点,包括HQL的基本概念、与SQL的区别以及如何使用HQL进行查询操作。希望本文能够帮助初学者更好地理解和掌握HQL的使用方法,从而提高在实际项目中的...

    Hibernate HQL查询.docx

    Hibernate 提供了一种非常强大的查询语言——HQL(Hibernate Query Language),它在语法上与 SQL 类似但功能更为强大,因为它支持面向对象的特性,例如继承、多态性和关联等。 #### 二、HQL 的特点 1. **面向对象*...

    hql文档详解 相信对初步的朋友有帮助

    HQL(Hibernate Query Language)是Hibernate提供的查询语言,它提供了丰富的查询功能。HQL作为推荐的标准查询方式,在HQL查询过程中,它不仅支持标准SQL查询语法,还提供了一种面向对象的封装方式。HQL在Hibernate...

    Hibernate HQL查询 分页查询 模糊查询.docx

    HQL(Hibernate Query Language)是一种面向对象的查询语言,它允许开发者使用类及其属性来编写查询语句,而不是传统的SQL语句。这使得开发人员能够更加专注于业务逻辑而不用深入到SQL层面。HQL支持各种复杂的查询,...

Global site tag (gtag.js) - Google Analytics