1导航对象图检索方式
根据己经加载的对象,导航到其他对象。
如: Dept dept= session.get(Dept.class ,10 ); // 持久Dept
//由于dept关联了emps集合,hibernate就会自动生成SQL语句去检索 Emp的数据
customer.getEmps.size()
2 OID检索方式
按照对象的OID来检索对象。
根据id检索 session提供 get/load 方法
3 HQL检索方式 使用面向对象的HQL查询语言。
采用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 Emp e where e.ename like '刘%'")
.list();
4 QBC检索方式 {根据面向对象的Criteria对象检索}
使用QBC(QueryBy Criteria)API来检索对象。
Criteria查询采用面向对象方式封装查询条件,又称为对象查询
由Hibernate 自动产生SQL查询语句
QBC API提供了检索对象的另一种方式,它主要由Criteria 接口、Criterion 接口和Expression 类组成。
支持在运行时动态生成查询语句。
使用QBL查询员工姓刘的
List<Emp> list= session.createCriteria(Emp.class)
.add(Restrictions.like("ename","刘%"))
.list();
5 QBE ( Query By Example ) 检索方式,它是QBC的子功能。
QBE允许先创建一个对象样板,然后检索出所有和这个样板相同的对象。
Emp emp1=new Emp();
template.setName("翠花");
List<Emp> emps= session.createCriteria(Emp.class)
.add(Example.create(emp1)).list();
6 本地SQL检索方式 {根据SQL语句检索}
使用本地数据库的SQL查询语句。
// 1)获得会话对象
Session session = HibernateUtil.currentSession();
String sql = "select {e.*} from emp e";
List<Object> list = session.createSQLQuery(sql)
.addEntity("e",Emp.class) //必须要指定实体类=》emp表名
.list();
7 命名SQL检索方式
(1)首先必须在对应的实体类配置文件中配置
<!-- 命名SQL查询 -->
<sql-query name="findByJob">
select {e.*} from emp e where e.job=?
<return alias="e" class="com.hlx.entity.Emp"/>
</sql-query>
(2)其次再调用这个配置的名称findByJob
// 1)获得会话对象
Session session = HibernateUtil.currentSession();
List<Object> list = session.getNamedQuery("findByJob")
.setParameter(0, "CLERK")
.list();
总结:
一般开发中第3种、第4种使用最多,但Hibernate框架本身不适合特别复杂数据表关系进行查询,在实际开发中如果查询特别复杂会直接编写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 | 不支持 | 适用于不存在关联关系的持久化类 |