Hibernate主要有如下几种查询方式:
导航对象图检索方式
根据己经加载的对象,导航到其他对象。
OID检索方式
按照对象的OID来检索对象。
HQL检索方式
使用面向对象的HQL查询语言。
HQL(Hibernate QueryLanguage) 是面向对象的查询语言,它和SQL查询语言有些相似。
在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。它具有如下功能:
- 在查询语句中设定各种查询条件。
- 支持投影查询,即仅检索出对象的部分属性。
- 支持分页查询。
- 支持连接查询。
- 支持分组查询,允许使用having和group by关键宇。
- 提供内置聚集函数,如sum()、min()和max()。
- 能够调用用户定义的SQL函数。
- 支持子查询,即嵌入式查询。
- 支持动态绑定参数。
Session类的find()方法与Query 接口都支持HQL 检索方式。这两者的区别在于,前者只是执行一些简单HQL 查询语句的便捷方法,它不具布动态绑定参数的功能。
使用HQL查询姓张的客户
List<?> customers = session.createQuery(
"from Customer as cwhere c.name like '张%'")
.list();
QBC检索方式
使用QBC(QueryBy Criteria)API来检索对象。
采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。
QBC API提供了检索对象的另一种方式,它主要由Criteria 接口、Criterion 接口和Expression 类组成。
支持在运行时动态生成查询语句。
使用QBL查询姓张的客户
List<?> customers = session.createCriteria(Customer.class)
.add(Restrictions.like("name","张%"))
.list();
Hibernate 还提供了QBE ( Query By Example ) 检索方式,它是QBC的子功能。QBE允许先创建一个对象样板,然后检索出所有和这个样板相同的对象。
Customer template =new Customer();
template.setName("张三");
List<?> customers = session.createCriteria(Customer.class)
.add(Example.create(template)).list();
本地SQL检索方式
使用本地数据库的SQL查询语句。
其中HQL与QBC的区别:
两者优缺点
比较方面 | HQL检索方式 | QBC检索方式 |
可读性 | 和SQL查询语言比较接近,比较容易读懂 | QBC把查询语句肢解为一组Criterion实例。可读性差。 |
功能 | 功能最强大,支持各种各样的查询。 | 没有HQL的功能强大,例如不支持报表查询和子查询,而且对连接查询也做了很多限制。 |
查询语句形式 | 应用程序必须提供基于字符串形式的HQL查询语句。 | QBC检索方式封装了基于字符串形式的查询语句,提供了更加面向对象的接口。 |
何时被解析 | HQL查询语句只有在运行时才会被解析 | OBC在编译时就能被编译,因此更加容易排错 |
可扩展性 | 不具有扩展性 | 允许用户扩展Criterion接口 |
对动态查询语句的支持 | 尽管支持生成动态查询语句,但是编程很麻烦 | 适合于生成动态查询语句 |
连接查询的支持
指定的连接查询类型 | HQL语法 | QBC语法 | 适用范围 |
内连接 | inner join或者join | Criteria.createAlias() | 适用于有关联关系的持久化类,并且在映射文件中对这种关联关系作了映射。 |
迫切内连接 | inner join fetch或者join fetch | 不支持 |
|
隐式内连接 |
| 不支持 |
|
左外连接 | left outer join或者left join | 不支持 |
|
迫切左外连接 | left outer join fetch或者left join fetch | FetchMode.EAGER |
|
右外连接 | right outer join或者right join | 不支持 |
|
交叉连接 | ClassA,ClassB | 不支持 | 适用于不存在关联关系的持久化类 |