Hibernate —— HQL与QBC的区别

Hibernate主要有如下几种查询方式:


导航对象图检索方式

根据己经加载的对象,导航到其他对象。

 

OID检索方式

按照对象的OID来检索对象。

 

HQL检索方式

使用面向对象的HQL查询语言。

HQL(Hibernate QueryLanguage) 是面向对象的查询语言,它和SQL查询语言有些相似。

在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。它具有如下功能:

  • 在查询语句中设定各种查询条件。
  • 支持投影查询,即仅检索出对象的部分属性。
  • 支持分页查询。
  • 支持连接查询。
  • 支持分组查询,允许使用havinggroup 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查询语句。


其中HQLQBC的区别:


两者优缺点


比较方面

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

不支持

适用于不存在关联关系的持久化类



你可能感兴趣的:(Hibernate)