Hibernate检索对象的方式

Hibernate提供的检索对象的方式有:

•导航对象图检索方式

–根据已经加载的对象,导航到其他对象。例如,对于已经加载的Customer对象,调用它的getOrders().iterator()方法就可以导航到所有关联的Order对象,假如在关联级别使用

了延迟加载检索策略,那么首次执行此方法时,Hibernate会从数据库中加载关联的Order对象,否则就从缓存中取得Order对象。

•OID检索方式

–按照对象的OID来检索对象。Session的get()和load()方法提供了这种功能。如果在应用程序中事先知道了OID,就可以使用这种检索对象的方式。

•HQL检索方式

–Hibernate提供了Query接口,它是Hibernate提供的专门的HQL查询接口,能够执行各种复杂的HQL查询语句。

•QBC检索方式

–使用QBC(Query By Criteria)API来检索对象。这种API封装了基于字符串形式的查询语句,提供了更加面向对象的接口。

•本地SQL 检索方式
–使用本地数据库的 SQL 查询语句

此外还有QBE检索方式(不常用),对于前两种及本地SQL方式不再详述,以下说明HQl和QBC方式:


1.HQL检索方式:


•HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL查询语言有些相似。在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式

它具有以下功能:

–在查询语句中设定各种查询条件

–支持投影查询,即仅检索出对象的部分属性

–支持分页查询

–支持连接查询

–支持分组查询,允许使用having和group by关键字

–提供内置聚集函数,如sum()、min()和max()

–支持子查询,即嵌入式查询

–支持动态绑定参数

•Query接口是HQL查询接口,它提供了以上列出的各种查询功能。

•HQL检索步骤:

(1)通过Session的createQuery()方法创建一个Query对象,它包含一个HQL查询语句。HQL查询语句可以包含命名参数,如“customerName”和“customerAge”都是命名参

数。

(2)动态绑定参数。Query接口提供了给各种类型的命名参数赋值的方法,例如setString()方法用于为字符串类型的customerName命名参数赋值。

(3)调用Query的list()方法执行查询语句。该方法返回List类型的查询结果,在List集合中存放了符合查询条件的持久化对象。

例:

//创建一个Query对象

Query query=session.createQuery("from Customer as c where "+" c.name=:customerName "+"and c.age=:customerAge");

//动态绑定参数

query.setString("customerName","Tom");

query.setInteger("customerAge",21);

//执行查询语句,返回查询结果

List result= query.list();

•方法链编程风格能使程序代码更加简洁

例:

List result=session.createQuery("……")
                  .setString("customerName","Tom")
                  .setInteger("customerAge",21)
                  .list();


2.QBC检索方式:


•采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。

•QBC API 提供了检索对象的另一种方式,它主要由Criteria接口Criterion接口Expression类组成,它支持在运行时动态生成查询语句。

•QBC检索步骤:

(1)调用Session的createCriteria()方法创建一个Criteria对象

(2)设定查询条件。Expression类提供了一系列用于设定查询条件的静态方法,这些静态方法都返回Criterion实例,每个Criterion实例代表一个查询条件。Criteria的add()方

法用于加入查询条件。

(3)调用Criteria的list()方法执行查询语句。该方法返回List类型的查询结果,在List集合中存放了符合查询条件的持久化对象。对于以上程序代码,当运行Criteria的list()方法

时,Hibernate执行的SQL查询语句为:

select * from CUSTOMERS where NAME like 'T%' and AGE=21;

例:

//创建一个Criteria对象

Criteria criteria=session.createCriteria(Customer.class);

//设定查询条件,然后把查询条件加入到Criteria中

Criterion criterion1= Expression.like("name", "T%") ;

Criterion criterion2= Expression.eq("age", new Integer(21)) ;

criteria=criteria.add(criterion1);

criteria=criteria.add(criterion2);

//执行查询语句,返回查询结果

List result=criteria.list();

•方法链编程风格

List result=session.createCriteria(Customer.class)
                     .add(Expression.like("name", "T%")
                     .add(Expression.eq("age", newInteger(21))
                     .list();


3.HQL和QBC方式分页查询:


• Query和Criteria接口都提供了用于分页显示查询结果的方法:

–setFirstResult(int firstResult):设定从哪一个对象开始检索,参数firstResult表示这个对象在查询结果中的索引位置,索引位置的起始值为0。默认情况下,Query和Criteria接

口从查询结果中的第一个对象,也就是索引位置为0的对象开始检索。

–setMaxResult(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();

(摘自风中叶张龙老师教学课件)


转载请注明出处:http://blog.csdn.net/jialinqiang/article/details/8719050

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值