Hibernate —— HQL与QBC的区别
2013-11-12 21:50
232 查看
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的区别:
两者优缺点
连接查询的支持
导航对象图检索方式
根据己经加载的对象,导航到其他对象。
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 | 不支持 | 适用于不存在关联关系的持久化类 |
相关文章推荐
- hibernate高级查询技术之“HQL和QBC”的区别
- Hibernate —— HQL与QBC的区别
- Hibernate中createCriteria即QBC查询的详细用法和HQL的区别?
- Hibernate —— HQL与QBC的区别
- Hibernate之HQL和QBC
- Hibernate 查询方式(HQL/QBC/QBE)汇总
- Hibernate通常是三种:hql查询,QBC查询和QBE查询:
- Hibernate:HQL/QBC查询语言比较的用法
- hibernate HQL查询以及原生SQL查询参数类型的区别
- Hibernate深入理解----Hibernate 检索方式(HQL,QBC,本地SQL)
- Hibernate 查询HQL,QBC 及命名HQL,SQL查询
- Hibernate的HQL,QBC 查询语言(包括多表联合查询join)
- Hibernate 的HQL,QBC 查询语言
- Hibernate的几种查询方式-HQL,QBC,QBE,离线查询,复合查询,分页查询
- Hibernate 查询方式(HQL/QBC/QBE)汇总
- Hibernate 查询方式(HQL/QBC/QBE)汇总
- Hibernate查询_HQL_EJBQL_QBC_QBE
- hibernate高级查询之 HQL(Hibernate Query Language)和QBC(Query By Criteria)的分析与研究
- Hibernate教程之四OID、HQL、SQL、QBC操作
- hibernate教程--检索方式详解(hql,sql,QBC)