您的位置:首页 > 其它

【Hibernate的检索方式】

2014-07-28 00:04 127 查看

一、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()来执行查询。

参考博客:点击打开链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: