Hibernate提供以下几种检索对象的方式。
l 导航对象图检索方式。(根据已经加载的对象,导航到其他对象。)
l OID检索方式。(按照对象的OID来检索对象。)
l HQL检索方式。(使用面向对象的HQL查询语言。)
l QBC检索方式。(使用QBC(Qurey By Criteria) API来检索对象。)
l 本地SQL检索方式。(使用本地数据库的SQL查询语句。)
一、Hibernate的检索方式简介
1、HQL检索方式
HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL查询语言有些相识。在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。它具有以下功能:
l 在查询语句中设定各种查询条件。
l 支持投影查询,即仅检索出对象的部分属性。
l 支持分页查询。
l 支持分组查询,允许使用having和group by关键字。
l 提供内置聚集函数,如sum()、min()和mac()。
l 能够调用用户定义的SQL函数。
l 支持子查询,即嵌入式查询。
l 支持动态绑定参数。
Session类的find方法及Qurey接口都支持HQL检索方式。区别在于,前者只是执行一些简单HQL查询语句的便捷方法,它不具有动态绑定参数的功能,而且在将来新的Hibernate版本中,有可能淘汰find方法;而Qurey接口才是真正的HQL查询接口,它提供了以上列出的各种查询功能。
注:Qurey接口支持方法链编程风格,它的set方法都返回自身实例,而不是返回void类型。方法链编程风格能使程序代码更加简洁。
示例代码:
Query query = session .createQuery("from Customer as c where " +"c.name=:customerName and c.age=:customerAge"); // 动态绑定参数 query.setString("customerName", "Test"); query.setInteger("customerAge", 21); // 执行检索 List result = query.list(); // 方法链编程风格 List result1 = session.createQuery( "from Customer as c where c.name=:customerName" + " and c.age=:customerAge").setString( "customerName", "Test").setInteger("customerAge", 21)
.list();
2、QBC(Qurey By Criteria)检索方式
采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。QBC API提供了检索对象的另一种方式,它主要由Criteria接口、Criterion接口和Expression类组成,它支持在运行时动态生成查询语句。
示例代码:
Criteria criteria = session.createCriteria(Customer.class); Criterion criterion1 = Expression.like("namr", "T%"); Criterion criterion2 = Expression.eq("age", new Integer(21)); criteria = criteria.add(criterion1); criteria = criteria.add(criterion2); // 执行检索 List result = criteria.list(); // 方法链编程风格 List result1 = session.createCriteria(Customer.class).add( Expression.like("namr", "T%")).add(
Expression.eq("age", new Integer(21))).list();
Hibernate还提供了QBE(Qurey By Example)检索方式,它是QBC的子功能。QBE允许先创建一个随想模板,然后检索出和这个样板相同的对象。
示例代码:
Customer exampleCustomer=new Customer(); exampleCustomer.setAge(21); List result1 = session.createCriteria(Customer.class).add(
Example.create(exampleCustomer)).list();
QBE的功能不是特别强大,仅在某些场合下有用。一个典型的使用场合就是在查询窗口中让用户输入一系列的查询条件,然后返回匹配的对象。QBE只支持“”和“”比较运算符,无法不大区间值,及其或的匹配。在这种情况下,还是采用HQL检索方式或QBC检索方式。
3、SQL检索方式
采用HQL或QBC检索方式时,Hibernate生成标准的SQL查询语句,使用于所有的数据库平台,因此这两种检索方式都是跨平台的
有的应用程序可能需要根据底层数据库的SQL方言,来生成一些特殊的查询语句。在这种情况下,可以利用Hibernate提供的SQL检索方式。
示例代码:
Query query = session.createSQLQuery("select {c.*} from CUSTOMER as c where c.NAME like :customerName and c.AGE=:customerAge"); // 动态绑定参数 query.setString("customerName", "Test"); query.setInteger("customerAge", 21); // 执行检索
List result = query.list();
4、使用别名
通过HQL检索一个类时,如果查询语句的其他地方需要引用它,应该为这个类指定一个别名,as关键字用于设定别名,也可以将as关键字省略。
QBC检索不需要由应用程序显式指定类的别名,Hibernate会自动把查询语句中的跟结点实体赋予别名“this”。
5、多态查询
HQL和QBC都支持多态查询,多态查询是指查询出当前类及所有子类的实例。多态查询对接口也使用。Hibernate不仅对from子句显式指定的类进行多态查询,而且对其他关联的类也会进行多态查询。
6、对查询结果排序
HQL和QBC都支持对查询结果进行排序。
query = session.createQuery("from Customer as c order by c.name");
//排序 criteria.addOrder(Order.asc("name"));
criteria.addOrder(Order.desc("age"));
7、分页查询
Query和Criteria接口都提供了用于分页显式查询结果的方法。
l setFirstResult(int firstResult):设置从那个对象开始检索,参数表示这个对象在查询结果中的索引位置,索引位置的起始值为0。默认从0检索。
l setMaxResult(int maxResults):设置一次最多检索出的对象数目。默认检索所有。
示例代码:
criteria = criteria.add(criterion1); criteria = criteria.add(criterion2); criteria.setFirstResult(0); criteria.setMaxResults(10); // 执行检索
List result = criteria.list();
query.setString("customerName", "Test"); query.setInteger("customerAge", 21); query.setFirstResult(0); query.setMaxResults(10); // 执行检索
List result = query.list();
8、检索单个对象
Query和Criteria接口都提供了以下用于查询语句并返回查询结果的方法。
l list()方法:返回一个List类型的查询结果。
l uniqueResult()方法:返回单个对象。
注:Query接口还提供了一个iterate()方法,它和list()方法一样,能返回所有满足条件的持久化对象,但是两者使用不同的SQL查询语句。
示例代码:
// 单个检索 Customer customer = (Customer) session.createQuery( "from Customer as c order by c.name").setMaxResults(1)
.uniqueResult();
// 单个检索 Customer customer = (Customer) session.createCriteria(
Customer.class).setMaxResults(1).uniqueResult();
如果明明知道一个对象,可以不调用setMaxResults(1)方法。
9、在HQL查询语句中绑定参数
A、按参数名字绑定。咋HQL中定义命名参数以“:”开头。
B、按照参数位置绑定。在HQL查询语句中用“?”来定义参数的位置。
示例代码:
Query query = session.createQuery("from Customer as c where " + "c.name=? and c.age=?"); // 动态绑定参数 query.setString(0, "Test");
query.setInteger(1, 21);
除了以上用于绑定映射类型的参数的方法,Hibernate还提供了以下三个特殊的参数绑定方法。
(1)setEntity()方法:把参数与一个持久化类的实例绑定。(用id关联)
(2)setParameter()方法:绑定任意类型的参数。
(3)setProperties()方法:用于把命名参数与一个对象的属性值绑定。
10、在映射文件中定义命名查询语句(略)
分享到:
相关推荐
在多表连接查询的场景下,Hibernate提供了几种不同的方法来处理数据关联,包括HQL(Hibernate Query Language)查询、Criteria API以及传统的JPA(Java Persistence API)注解。 1. **HQL查询**: Hibernate Query...
在Hibernate中,对象持久化的具体含义包括以下几个方面: - **保存**:将对象状态存储到数据库中。 - **更新**:更新数据库中对象的状态。 - **删除**:从数据库中移除对象。 - **查询**:根据某些条件从数据库中...
1、hibernate框架的检索方式有以下几种: OID检索:根据唯一标识OID检索数据 对象导航检索:根据某个对象导航查询与该对象关联的对象数据 HQL检索:通过query接口对象查询 QBC检索:通过criteria接口对象查询 ...
Hibernate是一个开源的对象关系映射(ORM)框架,它为Java语言提供了一种方便的工具来操作关系型数据库。Hibernate通过将Java程序中的POJO(普通旧Java对象)映射到数据库表,使得开发者可以使用面向对象的方式来操作...
同时,Hibernate还提供了对象的唯一标识机制,使得每个持久化对象都有一个唯一的标识符,这对于对象的检索和更新非常重要。 #### 实作equals()和hashCode() 为了确保Hibernate能够正确地识别和处理Java对象,开发者...
它提供了保存、更新、删除和检索对象的方法,同时提供了事务管理功能。 7. **Criteria查询**:除了SQL,Hibernate还提供了Criteria API,通过构建Criteria对象,可以动态地构建查询条件,更加面向对象,易于维护。 ...
2. **Session接口**:在Hibernate中,Session是与数据库进行交互的主要接口,它负责管理对象的状态,提供了保存、更新、删除和检索对象的方法。Session还支持事务处理,确保数据的一致性。 3. **Query和Criteria...
使用Hibernate全jar包进行开发时,你需要了解以下几个关键知识点: 1. **对象关系映射(ORM)**: Hibernate的核心功能是将Java对象与数据库表之间的映射,使得开发者可以像操作普通Java对象一样操作数据库。 2. **...
7. **HQL(Hibernate Query Language)**:Hibernate提供了一种面向对象的查询语言,类似于SQL,但更贴近于Java对象。HQL用于检索、修改和删除持久化对象。 8. **Criteria API**:另一种查询方式,允许基于对象的...
Hibernate定义了实体的几种状态:瞬时态、持久态、游离态和删除态。通过不同的状态转换,Hibernate实现了对象的生命周期管理,如持久化对象的持久化、检索、更新和删除。 九、实体关系映射 Hibernate支持多种关系...
在Hibernate 5的官方文档中,你会了解到以下几个关键知识点: 1. **ORM概念**:ORM是一种技术,它在对象和关系数据库之间建立桥梁,简化了数据库操作。Hibernate作为ORM框架,通过映射Java类到数据库表,实现了对象...
Hibernate是一种广泛应用于Java开发中的对象关系映射(ORM)框架,它的核心价值在于简化了数据库操作,通过将Java对象模型与SQL关系模型进行映射,使得开发者可以使用面向对象的方式来处理数据库。Hibernate不仅管理...
4. **持久化(Persistence)**:Hibernate提供了几种方式来实现对象的持久化,如`Session`接口提供的`save()`, `persist()`, `update()`和`merge()`方法。 5. **查询语言(HQL)**:Hibernate有自己的查询语言,即...
7. ** Criteria 查询**:提供了一种比HQL更面向对象的查询方式,可以动态构建查询条件,支持复杂的查询逻辑。 8. **HQL(Hibernate Query Language)**:Hibernate特有的查询语言,类似SQL,但更加面向对象,用于...
Hibernate定义了对象的几种生命周期状态:瞬时态、持久态、脱管态和临时态。理解这些状态对于正确使用Hibernate至关重要,因为它们决定了对象何时会被保存、更新或删除。 7. **一对多、多对一和多对多关系映射** ...
Hibernate是一种开源的对象关系映射(Object Relational Mapping,简称ORM)框架,它为Java应用提供了数据持久化的解决方案。通过ORM,开发人员可以将Java对象模型映射到数据库表结构上,从而避免了繁琐的SQL语句...
Hibernate通过提供一种对象化的接口,使得开发者可以使用面向对象的方式来操作数据库,避免了传统的SQL操作带来的繁琐。它将Java对象与数据库表进行映射,实现了数据的透明化访问,大大提高了开发效率。 NetStore...
3. Criteria API 和 HQL(Hibernate Query Language):这两种查询语言提供了灵活的数据检索方式,HQL是面向对象的查询语言,类似SQL,而Criteria API则是基于对象的API,更易于使用和动态构建查询。 4. Cache:为了...