06_Hibernate检索对象的方式

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

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(QueryByCriteria)API来检索对象。这种API封装了基于字符串形式的查询语句,提供了更加面向对象的接口。本章有时把QBC检索方式简称为QBC。本地SQL检索方式使用本地数据库的SQL查询语句。Hibernate会负责把检索到的JDBCResultSet结果集映射为持久化对象图。HQL检索方式HQL(HibernateQueryLanguage)是面向对象的查询语言,它和SQL查询语言有些相似。在Hibernate提供的各种检索方式中,HQL是使用最广的一种检索方式。它具有以下功能:在查询语句中设定各种查询条件支持投影查询,即仅检索出对象的部分属性支持分页查询支持连接查询支持分组查询,允许使用having和groupby关键字提供内置聚集函数,如sum()、min()和max()能够调用用户定义的SQL函数支持子查询,即嵌入式查询支持动态绑定参数Session的find()方法以及Query接口Session类的find()方法以及Query接口都支持HQL检索方式。这两者的区别在于,前者只是执行一些简单HQL查询语句的便捷方法,它不具有动态绑定参数的功能,而且在Hibernate3.x版本中,已经淘汰了find()方法;而Query接口才是真正的HQL查询接口,它提供了以上列出的各种查询功能。HQL检索步骤//创建一个Query对象Queryquery=session.createQuery(fromCustomerascwhere+c.name=:customerName+andc.age=:customerAge);//动态绑定参数query.setString(customerName,Tom);query.setInteger(customerAge,21);//执行查询语句,返回查询结果Listresult=query.list();HQL检索步骤(1)通过Session的createQuery()方法创建一个Query对象,它包含一个HQL查询语句。HQL查询语句可以包含命名参数,如“customerName”和“customerAge”都是命名参数。(2)动态绑定参数。Query接口提供了给各种类型的命名参数赋值的方法,例如setString()方法用于为字符串类型的customerName命名参数赋值。(3)调用Query的list()方法执行查询语句。该方法返回List类型的查询结果,在List集合中存放了符合查询条件的持久化对象。方法链编程风格Listresult=session.createQuery(……).setString(customerName,Tom).setInteger(customerAge,21).list();方法链编程风格能使程序代码更加简洁。QBC检索方式采用HQL检索方式时,在应用程序中需要定义基于字符串形式的HQL查询语句。QBCAPI提供了检索对象的另一种方式,它主要由Criteria接口、Criterion接口和Expression类组成,它支持在运行时动态生成查询语句。QBC检索方式//创建一个Criteria对象Criteriacriteria=session.createCriteria(Customer.class);//设定查询条件,然后把查询条件加入到Criteria中Criterioncriterion1=Expression.like(name,T%);Criterioncriterion2=Expression.eq(age,newInteger(21));criteria=criteria.add(criterion1);criteria=criteria.add(criterion2);//执行查询语句,返回查询结果Listresult=criteria.list();QBC检索步骤(1)调用Session的createCriteria()方法创建一个Criteria对象。(2)设定查询条件。Expression类提供了一系列用于设定查询条件的静态方法,这些静态方法都返回Criterion实例,每个Criterion实例代表一个查询条件。Criteria的add()方法用于加入查询条件。(3)调用Criteria的list()方法执行查询语句。该方法返回List类型的查询结果,在List集合中存放了符合查询条件的持久化对象。对于以上程序代码,当运行Criteria的list()方法时,Hibernate执行的SQL查询语句为:select*fromCUSTOMERSwhereNAMElike'T%'andAGE=21;方法链编程风格Listresult=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对象Stringsql=select{c.*}fromCOURSEScwherec.NAME=:name;//注意,1。3以后只能这么用了SQLQueryquery=session.createSQLQuery(sql);query.addEntity(c,Course.class);query.setString(name,shuxue);Listlist=query.list();分页查询Query和Criteria接口都提供了用于分页显示查询结果的方法:setFirstResult(intfirstResult):设定从哪一个对象开始检索,参数firstResult表示这个对象在查询结果中的索引位置,索引位置的起始值为0。默认情况下,Query和Criteria接口从查询结果中的第一个对象,也就是索引位置为0的对象开始检索。setMaxResult(intmaxResults):设定一次最多检索出的对象数目。默认情况下,Query和Criteria接口检索出查询结果中所有的对象。分页查询//采用HQL检索方式Queryquery=session.createQuery(fromCustomercorderbyc.nameasc);query.setFirstResult(0);query.setMaxResults(10);Listresult=query.list();//采用QBC检索方式Criteriacriteria=session.createCriteria(Customer.class);criteria.addOrder(Order.asc(name));criteria.setFirstResult(0);criteria.setMaxResults(10);Listresult=criteria.list();迫切左外连接以下两种检索方式是等价的,它们都能同时迫切左外连接类B和类C://HQL迫切左外连接检索方式fromAaleftjoinfetcha.bbleftjoinfetcha.ccwherebisnotnullandcisnotnull//QBC迫切左外连接检索方式Listresult=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关键字用于选择对象的部分属性,例如:Iteratorit=session.createQuery(selectc.id,c.name,o.orderNumber+fromCustomercjoinc.orderso+whereo.orderNumberlike'T%').list().iterator();while(it.hasNext()){Object[]row=(Object[])it.next();Longid=(Long)row[0];Stringname=(String)row[1];StringorderNumber=(String)row[2];System.out.println(id++name++orderNumber);}投影查询HQL查询语句对应的SQL语句为:selectc.ID,c.NAME,o.ORDER_NUMBERfromCUSTOMERScinnerjoinORDERSoonc.ID=o.CUSTOMER_IDwhereo.ORDER_NUMBERlike'T%';以上查询语句的查询结果如下:+----+------+--------------+|ID|NAME|ORDER_NUMBER|+----+------+--------------+|1|Tom|Tom_Order001||1|Tom|Tom_Order002||1|Tom|Tom_Order003|+----+------+--------------+Query的list()方法返回的集合中包含三个对象数组类型的元素,每个对象数组代表以上查询结果的一条记录。

1 / 17
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功