【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.SerializableHibernate不仅对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.SerializableHibernate不仅对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检索方式
- Hibernate学习笔记(三)--检索方式
- Hibernate中检索方式返回值的一些心得
- Hibernate 检索方式简介 2
- Hibernate学习(八):检索方式
- Hibernate 的检索方式
- Hibernate的检索方式(二)
- Hibernate的检索方式(一)
- Hibernate的检索方式(一)
- Hibernate检索方式
- Hibernate的检索方式(一)【转】
- Hibernate的检索方式
- Hibernate的检索方式(三)
- Hibernate的检索方式(五)【转】
- Hibernate检索方式
- Hibernate检索方式
- Hibernate的检索方式(四)【转】
- Hibernate的检索方式(五)
- Hibernate学习(八):检索方式