一、Hibernate检索方式简介
Hibernate提供以下几种检索对象的方式:
- 导航对象图检索方式。(根据已经加载的对象,导航到其他对象。)
-
OID检索方式。(按照对象的OID来检索对象。)
-
HQL检索方式。(使用面向对象的HQL查询语言。)
-
QBC检索方式。(使用QBC(Query By Criteria)API来检索对象)
-
本地SQL检索方式。(使用本地数据库的SQL查询语句。)
HQL检索方式
HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL查询语言有些相似。在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。它具有以下功能:
- 在查询语句中设定各种查询条件。
- 支持投影查询,即仅检索出对象的部分属性。
- 支持分页查询。
- 支持连接查询。
- 支持分组查询,允许使用having和group by关键字。
- 提供内置聚集函数,如sum()、min()和mac()。
- 能够调用用户定义的SQL函数。
- 支持子查询,即嵌入式查询。
- 支持动态绑定参数。
Query接口支持方法链接编程风格
// 方法链编程风格
List result1 = session.createQuery("from Customer").setString("customerName","Test").setInteger("customerAge", 21).list();
QBC检索方式
HQL(Hibernate Query Language)
本地SQL检索方式
QBC API提供了检索对象的另一种方式,它主要由Criteria接口、criterion接口和Restrictions类组成,它支持在运行时动态生成查询语句。
多态查询
HQL和QBC都支持多态查询,多态查询是指查询出当前类及所有子类的实例,对于以下查询代码:
//采用HQL检索方式
session.createQuery("from Employee");
//采用QBC检索方式
session.createCriterial(Employee.class);
假如Employee类还有两个子类:HourlyEmployee和SalariedEmployee,那么这个查询语句会查询出所有Employee类的实例,以及两个子类的实例。
如果只想检索某个特定子类的实例,可以使用如下方式:
//采用HQL检索方式
session.createQuery("from HourlyEmployee");
//采用QBC检索方式
session.createCriterial(HourlyEmployee.class);
以下HQL查询语句将检索出所有的持久化对象:
from java.lang.Object
多态查询对接口也适用。例如,以下HQL查询语句检索出所有实现Serializable接口的实例:
from java.io.Serializable
Hibernate不仅对from子句中显式指定的类进行多态查询,而且对其它关联的类也进行多态查询。
分页查询
Query和Criteria接口都提供了用于分页获取查询结果的方法。
- setFirstResult(int firstResult) 设置返回结果从第几条开始
- setMaxResults(int maxResults) 设置本次返回结果记录条数。默认情况下,Query和Criteria接口检索出查询结果中所有的对象。
//采用HQL检索方式
Query query = session.createQuery("from Customer c order by c.name asc");
query.setFirstResult(0);
query.setMaxResults(10);
List result=query.list();
//采用QBC检索方式
Criteria criteria=session.createCriteria(Customer.class);
criteria.addOrder(Order.asc("name"));
criteria.setFirstResult(0);
criteria.setMaxResults(10);
List result = criteria.list();
检索单个对象(uniqueResult())
Query和Criteria接口都提供了以下用于查询语句并返回查询结果的方法。
- list()方法:返回一个List类型的查询结果。
- uniqueResult()方法:返回单个对象。
注:Query接口还提供了一个iterate()方法,它和list()方法一样,能返回所有满足条件的持久化对象,但是两者使用不同的SQL查询语句。
在某些情况下,如果只希望检索出一个对象,可以先调用Query或Criteria接口的setMaxResults(1),把最大检索数目设为1
setMaxResults(1)
如果明确知道查询结果只会包含一个对象,则可以不用调用setMaxResults(1)方法。
按主键逐个处理查询结果(iterate()方法)
Query接口还提供一个iterate()方法,它和list()方法一样,也能执行查询操作。iterate()和list()的区别在于两者使用的查询机制不一样。
对于以下代码:
List c1=session.createQuery("from Customer c where c.age>10").list;//第1行
Iterator c2=session.createQuery("from Customer c where c.age>10").iterate();//第2行
第一行程序的list()执行的语句为
select ID,NAME,AGE from CUSTOMERS where AGE>10;
第二行程序的iterate()执行的语句为:
select ID from CUSTOMERS where AGE>10;
iterate的用法
Iterator c=session.createQuery("from Customer c where c.age>10").iterate();
while(c.hasNext()){
Customer customer=(Customer)customers.next();
System.out.println(customer.getName);
}
大多数情况下应该考虑使用Query的list()来执行查询。
多态查询
HQL和QBC都支持多态查询,多态查询是指查询出当前类及所有子类的实例,对于以下查询代码:
//采用HQL检索方式
session.createQuery("from Employee");
//采用QBC检索方式
session.createCriterial(Employee.class);
假如Employee类还有两个子类:HourlyEmployee和SalariedEmployee,那么这个查询语句会查询出所有Employee类的实例,以及两个子类的实例。
如果只想检索某个特定子类的实例,可以使用如下方式:
//采用HQL检索方式
session.createQuery("from HourlyEmployee");
//采用QBC检索方式
session.createCriterial(HourlyEmployee.class);
以下HQL查询语句将检索出所有的持久化对象:
from java.lang.Object
多态查询对接口也适用。例如,以下HQL查询语句检索出所有实现Serializable接口的实例:
from java.io.Serializable
Hibernate不仅对from子句中显式指定的类进行多态查询,而且对其它关联的类也进行多态查询。
分页查询
Query和Criteria接口都提供了用于分页获取查询结果的方法。
- setFirstResult(int firstResult) 设置返回结果从第几条开始
- setMaxResults(int maxResults) 设置本次返回结果记录条数。默认情况下,Query和Criteria接口检索出查询结果中所有的对象。
//采用HQL检索方式
Query query = session.createQuery("from Customer c order by c.name asc");
query.setFirstResult(0);
query.setMaxResults(10);
List result=query.list();
//采用QBC检索方式
Criteria criteria=session.createCriteria(Customer.class);
criteria.addOrder(Order.asc("name"));
criteria.setFirstResult(0);
criteria.setMaxResults(10);
List result = criteria.list();
检索单个对象(uniqueResult())
Query和Criteria接口都提供了以下用于查询语句并返回查询结果的方法。
- list()方法:返回一个List类型的查询结果。
- uniqueResult()方法:返回单个对象。
注:Query接口还提供了一个iterate()方法,它和list()方法一样,能返回所有满足条件的持久化对象,但是两者使用不同的SQL查询语句。
在某些情况下,如果只希望检索出一个对象,可以先调用Query或Criteria接口的setMaxResults(1),把最大检索数目设为1
setMaxResults(1)
如果明确知道查询结果只会包含一个对象,则可以不用调用setMaxResults(1)方法。
按主键逐个处理查询结果(iterate()方法)
Query接口还提供一个iterate()方法,它和list()方法一样,也能执行查询操作。iterate()和list()的区别在于两者使用的查询机制不一样。
对于以下代码:
List c1=session.createQuery("from Customer c where c.age>10").list;//第1行
Iterator c2=session.createQuery("from Customer c where c.age>10").iterate();//第2行
第一行程序的list()执行的语句为
select ID,NAME,AGE from CUSTOMERS where AGE>10;
第二行程序的iterate()执行的语句为:
select ID from CUSTOMERS where AGE>10;
iterate的用法
Iterator c=session.createQuery("from Customer c where c.age>10").iterate();
while(c.hasNext()){
Customer customer=(Customer)customers.next();
System.out.println(customer.getName);
}
大多数情况下应该考虑使用Query的list()来执行查询。
参考博客:
点击打开链接
分享到:
相关推荐
### Hibernate的五种检索方式详解 #### 一、导航对象图检索方式 导航对象图检索是一种常见的对象关联查询方式。这种方式通常用于加载已经存在于内存中的对象,并通过这些对象访问与其关联的对象。例如,在一个订单...
### Hibernate数据检索(HQL)知识点详解 #### 一、简介 Hibernate 是一款开源的对象关系映射(ORM)框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而极大地简化了数据访问层的开发工作。本文档基于...
一、Hibernate检索方式 1. **HQL(Hibernate Query Language)**: HQL是Hibernate提供的面向对象的查询语言,类似于SQL,但它是基于类和对象的。你可以通过HQL来查询、更新和删除对象,而无需关心底层的SQL语法。...
标题:“HIBERNATE检索策略” 描述:本文深入解析了HIBERNATE的检索策略,为读者提供了一条清晰的学习路径,重点分析了HIBERNATE中的抓取策略及其应用场景,帮助开发者更有效地管理和优化数据加载过程。 在...
标题中的“day36 04-Hibernate检索方式:多表连接查询”表明这是一个关于Hibernate框架的教程,重点讲解如何在Hibernate中进行多表连接查询。在这个主题中,我们将深入探讨Hibernate的ORM(对象关系映射)机制以及...
本教程将深入探讨"day36-hibernate检索和优化 02-Hibernate检索方式:简单查询及别名查询"的主题,通过源码分析和实际工具的应用,来提升数据库查询的效率。 首先,我们了解Hibernate的检索方式。在Hibernate中,...
在现代Web应用开发中,全文检索功能已经成为提升用户体验的关键因素之一。Spring框架是Java领域最广泛使用的应用框架,而Hibernate则是流行的ORM(对象关系映射)解决方案。当这两个强大的工具结合,通过Hibernate ...
### Hibernate检索方式详解 #### 一、概述 Hibernate是一个强大的对象关系映射(ORM)框架,它可以将Java对象与数据库表进行映射,使得开发者能够更方便地进行数据的持久化操作。在Hibernate中,提供了多种检索...
### Hibernate的检索策略详解 #### 一、概述 在Java持久化框架Hibernate中,检索策略是一种重要的机制,它主要用于控制对象何时以及如何加载到应用程序内存中。合理的检索策略不仅可以提高应用性能,还能简化代码...
Hibernate 是一个流行的 Java 持久层框架,它提供了多种检索数据的方式,包括导航对象图检索、OID 检索、HQL 检索、QBC 检索和本地 SQL 检索等。下面将详细介绍每种检索方式。 一、导航对象图检索 导航对象图检索...
一、Hibernate检索方式概述 Hibernate提供了多种检索数据的方法,以适应不同的需求场景。这些方法包括:HQL(Hibernate Query Language)、QBC(Query By Criteria)、Criteria API以及直接使用Session的get()和load...
注解作为Java SE 5引入的新特性之一,在Hibernate中被广泛应用于配置实体类和关联关系。 ##### PO类注解配置(掌握) - **@Entity**:声明类为一个实体,即该类将映射到数据库中的某个表。 - **@Table**:用于指定...
在Java开发领域,Hibernate是一个非常重要的对象关系映射(ORM)框架,它简化了数据库操作,使得开发者可以使用面向对象的方式来处理数据。本教程重点聚焦于Hibernate的数据检索机制,特别是Hibernate查询语言(HQL...
本PPT描述了对SHH框架中hibernate数据检索功能的描述,用户可以更快的学习Hibernate数据检索
本人在厦门邦初培训时候 使用的快速入门精简文档 Session缓存的作用 Session清理缓存的时间点 对象的临时状态、持久状态和游离状态 用session的update()方法使游离对象转变为持久化对象。...本地SQL检索方式
通过这种方式,只有当确实需要访问集合中的数据时,Hibernate才会执行数据库查询,从而节省了资源。 #### 3. 延迟加载在轻量级J2EE框架中的应用 在轻量级J2EE框架中,如Spring+Hibernate,延迟加载机制的应用非常...
【Hibernate检索策略】 Hibernate提供三种主要的检索策略:立即检索、延迟检索和迫切左外连接检索。 1. **立即检索**:这种策略将立即加载关联的对象,无论对象是持久化状态还是游离状态。优点是应用程序可以方便...