Hibernate检索对象的方式.ppt_第1页
Hibernate检索对象的方式.ppt_第2页
Hibernate检索对象的方式.ppt_第3页
Hibernate检索对象的方式.ppt_第4页
Hibernate检索对象的方式.ppt_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Hibernate检索对象的方式,教学内容 HQL检索方式 QBC检索方式 本地SQL检索方式,Hibernate提供的检索对象的方式,导航对象图检索方式 根据已经加载的对象,导航到其他对象。例如,对于已经加载的Customer对象,调用它的getOrders().iterator()方法就可以导航到所有关联的Order对象,假如在关联级别使用了延迟加载检索策略,那么首次执行此方法时,Hibernate会从数据库中加载关联的Order对象,否则就从缓存中取得Order对象。 OID检索方式 按照对象的OID来检索对象。Session的get()和load()方法提供了这种功能。如果在应用程序中事先知道了OID,就可以使用这种检索对象的方式。 HQL检索方式 使用面向对象的HQL查询语言。Session的find()方法用于执行HQL查询语句。此外,Hibernate还提供了Query接口,它是Hibernate提供的专门的HQL查询接口,能够执行各种复杂的HQL查询语句。本章有时把HQL检索方式简称为HQL。 QBC检索方式 使用QBC(Query By Criteria)API来检索对象。这种API封装了基于字符串形式的查询语句,提供了更加面向对象的接口。本章有时把QBC检索方式简称为QBC。 本地SQL检索方式 使用本地数据库的SQL查询语句。Hibernate会负责把检索到的JDBC ResultSet结果集映射为持久化对象图。,HQL检索方式,HQL(Hibernate Query Language)是面向对象的查询语言,它和SQL查询语言有些相似。在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。它具有以下功能: 在查询语句中设定各种查询条件 支持投影查询,即仅检索出对象的部分属性 支持分页查询 支持连接查询 支持分组查询,允许使用having和group by关键字 提供内置聚集函数,如sum()、min()和max() 能够调用用户定义的SQL函数 支持子查询,即嵌入式查询 支持动态绑定参数,Session的find()方法以及Query接口,Session类的find()方法以及Query接口都支持HQL检索方式。 这两者的区别在于,前者只是执行一些简单HQL查询语句的便捷方法,它不具有动态绑定参数的功能,而且在Hibernate3.x版本中,已经淘汰了find()方法;而Query接口才是真正的HQL查询接口,它提供了以上列出的各种查询功能。,HQL检索步骤,/创建一个Query对象 Query query=session.createQuery(“from Customer as c where “ +“ =:customerName “ +“and c.age=:customerAge“); /动态绑定参数 query.setString(“customerName“,“Tom“); query.setInteger(“customerAge“,21); /执行查询语句,返回查询结果 List result= query.list();,HQL检索步骤,(1)通过Session的createQuery()方法创建一个Query对象,它包含一个HQL查询语句。HQL查询语句可以包含命名参数,如“customerName”和“customerAge”都是命名参数。 (2)动态绑定参数。Query接口提供了给各种类型的命名参数赋值的方法,例如setString()方法用于为字符串类型的customerName命名参数赋值。 (3)调用Query的list()方法执行查询语句。该方法返回List类型的查询结果,在List集合中存放了符合查询条件的持久化对象。,方法链编程风格,List result=session.createQuery(“) .setString(“customerName“,“Tom“) .setInteger(“customerAge“,21) .list(); 方法链编程风格能使程序代码更加简洁。,QBC检索方式,采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。 QBC API 提供了检索对象的另一种方式,它主要由Criteria接口、Criterion接口和Expression类组成,它支持在运行时动态生成查询语句。,QBC检索方式,/创建一个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();,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;,方法链编程风格,List result=session.createCriteria(Customer.class) .add(Expression.like(“name“, “T%“) .add(Expression.eq(“age“, newInteger(21) .list();,SQL检索方式,采用HQL或QBC检索方式时,Hibernate会生成标准的SQL查询语句,适用于所有的数据库平台,因此这两种检索方式都是跨平台的。 有的应用程序可能需要根据底层数据库的SQL方言,来生成一些特殊的查询语句。在这种情况下,可以利用Hibernate提供的SQL检索方式。 /创建Query对象 String sql = “select c.* from COURSES c where c.NAME =:name“; /注意,1。3以后只能这么用了 SQLQuery query=session.createSQLQuery(sql); query.addEntity(“c“, Course.class); query.setString(“name“, “shuxue“); List list = query.list();,分页查询,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 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();,迫切左外连接,以下两种检索方式是等价的,它们都能同时迫切左外连接类B和类C: /HQL迫切左外连接检索方式 from A a left join fetch a.b b left join fetch a.c c where b is not null and c is not null /QBC迫切左外连接检索方式 List result=session.createCriteria(A.class) .setFetchMode(“this.b“,FetchMode.EAGER) .setFetchMode(“this.c“,FetchMode.EAGER) .add(Expression.isNotNull(“this.b“) .add(Expression.isNotNull(“this.c“) .list();,投影查询,select关键字用于选择对象的部分属性,例如: Iterator it=session.createQuery( “select c.id,,o.orderNumber “ + “ from Customer c join c.orders o “ +“ where o.orderNumber like T%“ ).list().iterator(); while(it.hasNext() Object row=(Object)it.next(); Long id=(Long)row0; String name=(String)row1; String orderNumber=(String)row2; System.out.println(id+“ “+name+“ “+orderNumber); ,投影查询,HQL查询语句对应的SQL语句为: select c.ID,c.NAME,o.ORDER_NUMBER from CUSTOMERS c inner join ORDERS o on c.ID=o.CUSTOMER_

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论