第6章 高级数据检索.ppt_第1页
第6章 高级数据检索.ppt_第2页
第6章 高级数据检索.ppt_第3页
第6章 高级数据检索.ppt_第4页
第6章 高级数据检索.ppt_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

1、Hibernate ORM 最佳实践第6章 高级数据检索,2,回顾,使用动态类进行关系映射 使用组件进行关系映射 映射值类型的集合 一个持久化类对应多个表的映射,3,目标,QBC(query by criteria)面向对象查询方式 利用HQL和criteria连接查询 Hibernate的数据检索策略,4,QBC数据检索,HQL示例,class book private String bname; private int bversion; private String author; private Date bdate; private String press; : : ,根据用户输入

2、的条件查询所 需要的书籍. 如果使用HQL查询: where的条件怎么设置?,session.createQuery(from book where ),QBC:Query by Criteria:以函数API的方式动态设置查询条件,组成查询语句.,静态字符串查询语句,5,QBC查询主要类,Criteria接口:用来设置各种查询条件的,利用session的方法createCriteria(“目标实体类类型”)创建criteria对象, Criteria crit=session.createCriteria(“Teacher.class”); 生成Criterion对象,作为查询条件. Cri

3、terion cond=Restrictions.eq(“teacherID”,new Long(102); 利用Criteria接口方法add添加Criterion对象设置查询条件 crit.add(cond); 调用Criteria的list方法或scroll方法执行查询语句. List results=crit.list(); ScrollableResults scrollresult=crit.scroll(); 从List或ScrollableResults 中取出查询对象.,6,示例,7,示例,利用Criteria查询101号老师所带在校生和毕业生的学号及姓名:,运行结果:,8,

4、分析-1,Criteria接口中的主要方法 Criteria add(Criterion criterion):添加查询条件,作用where条件. 如果说查询条件是多个并列或者是只要满足其中一个条件,怎样实现and或or逻辑操作? 如:查询教师ID号200,并且教师姓名以T开头的所有教师?,在Hibernate规定:当设置多个add方法就相当于对查询条件进行and操作.,9,分析-2,查询教师ID=200或者教师姓名不以T或t开头的所有教师.,Criteria addOrder(Order order)增加排序,Criteria createAlias(String associationPa

5、th,String alias),关联实体属性名,别名,为对象实体属性设置别名来实现关联,Criteria createAlias(String associationPath,String alias,int joinType),CriteriaSpecification.INNER_JOIN, CriteriaSpecification.FULL_JOIN CriteriaSpecification.LEFT_JOIN ,CriteriaSpecification.RIGHT_JOIN,10,示例,查找教师101所带学生姓名为刘的所有学生的学号及姓名,对象实体属性student,11,代码

6、,注意:createAlias()方法不会返回新的实例,还是原来的Criteria 实例,这样设置Teacher与Student的关联关系.,Criteria createCriteria(String associationPath,String alias),关联实体属性名,返回一个新的Criteria实例,12,代码,产生新的Criteria实例crit1,Criteria setProjection (Projection projection),Projections类提供许多静态方法来产生对查询结果进行选择 某些属性的投影,进行avg、max、min、count、sum等聚集运算。

7、,13,示例,计算学生中来自成都的有多少?,查询来自成都的学生的学号及姓名,14,代码,ProjectionLis:添加投影列,查询返回的list对象中含有对象数组Object ,其中Object0代表sid,Object1代表sname,15,DetachedCriteria类,在前面例子中,在使用Criteria对象的前提必须有一个Session对象,因此这种依赖关系限制Criteria接口的使用范围。 考虑以下情况: 需要在没有Session对象的情况下创建数据查询; 同一个数据查询跨越多个Session对象 Hibernate提供一个可以脱离Session对象的查询对象:Detache

8、dCriteria,DetachedCriteria.forClass(实体类类型),DetachedCriteria,封装一个 CriteriaImpl对象,getSession( ),session对象,criteria对象(脱离session),criteria.getExecutableCriteria(session),criteria对象(关联session),16,示例,只有关联到session后才可以list,17,小结,18,Criterion类和Restrictions类,1.Criterion 是 Criteria 的查询条件。 2.Criteria 提供了 add(Cr

9、iterion criterion) 方法来添 加查询条件。 3.Criterion 的实例可以通过 Restrictions 工具类来 创建, Restrictions 提供了大量的静态方法,如 eq (等于)、 ge (大于等于)、 between 等来方法 的创建 Criterion查询条件( SimpleExpression 实例) 4.除此之外,Restrictions 还提供了方法来创建 conjunction 和 disjunction 实例,通过往该实例的 add(Criteria) 方法来增加查询条件形成一个查询 条件集合。,19,Restrictions类的方法,设置Cri

10、terion查询条件,20,Projection和Projections类,1.Projection 主要是让 Criteria 能够进行报表查询,并可以实现分组。 Projection主要有 SimpleProjection 、 ProjectionList 和 Property 三个实现。其中 SimpleProjection 和 ProjectionList 的实例化是由内建的 Projections 来完成,如提供的 avg 、 count 、 max 、 min 、 sum 可以让开发者很容易对某个字段进行统计查询。 2. Property 是对某个字段进行查询条件的设置,如通过 P

11、orperty.forName(“color”).in(new String“black”,”red”,”write”); 则可以创建一个 Criterion实例。 3.通过 criteria 的 setProjection(Projection) 方法加入到查询条件中去。,21,Projections的方法,SimpleProjection 和 ProjectionList 的 实例化是由内建的 Projections 来完成,22,示例,查询来自成都的学生,并且由101号老师所带的,该学生的学号及姓名,23,逻辑组合,如果逻辑关系比较复杂,可以使用Restrictions.disjunct

12、ion()代表逻辑或、Restrictions.conjuction()代表逻辑与,查询由表101号老师所带学号范围(602-608)的姓王或姓刘的学生的学号、姓名,24,举例查询(QBE),使用Example类进行查询,Example 本身提供了一个静态方法 create(Object entity) ,即根据一个对象(实际使用中一般是映射到数据库的对象)来创建。然后可以设置一些过滤条件: Example exampleUser =Example.create(u) .ignoreCase() / 忽略大小写 .enableLike(MatchMode.ANYWHERE); Criteria

13、 crit=session.createCriteria(Student.class); crit.add(exampleUser ); List results=crit.list();,ANYWHERE、END、EXACT、START,25,连接查询,三中连接方式:内连接、左外连接、右外连接,内连接:是利用关键字INNER JOIN内联合两个实体对象,只返回满足关键字ON 定义 的条件的记录。 任何不满足条件的记录都会被排除在结果之外; 外连接:在整个查询过程中以一个表格为主,另一个表格为辅,主表格中的记录不论是 否满足条件都应该出现在结果集合中,而辅助表格中的记录则必须满足条件。,一、H

14、QL连接查询(inner join 、 left join 、 right join),26,示例,27,list中的每个元素是Object ,其中Object0 是Student对象,Object1是Teacher对象,28,HQL支持fetch查询,在HQL中使用fetch,在返回的list中存放的对象是主类对象,而不是以对象组形式返回关联的两个类对象。,只返回主类对象Student,29,检索策略-类级别,类级别 :关于POJO类什么时候被载入 类级别延迟加载(代理检索策略),在编译期间进行字节码增强操作,很少用,当检索一个类,其所有属性 从数据库中检索到session中,当检索一个类,

15、得到是只有 主键属性的代理对象(其它非主键属性为空), 只有在访问非主键属性时,才初始化其他属性, 对象才载入.,类级别延迟加载只是在调用load函数时有用;如果使用get函数,或者使用Query.list()执行查询,立即 加载类对象; 在POJO的映射文件中增加lazy属性(true|false),默认是延迟加载.,30,示例,类级别延迟加载,cp为代理对象,并没有执行select操作,访问非主属性,触发select操作,31,类级别延迟加载,如果load的对象不存在,在执行load()时是不会发现的,只有在访问非主键属性时才抛出异常;,主键不存在,Load()执行时正常的,没发现id不存

16、在,对象只能在session范围内被加载,如果session关闭了,再返回对象就会抛出异常.,32,示例,提前关闭session,33,示例,类级别延迟对get或Query.list()方法不起作用,立即检索,立即检索,select操作触发,相当于lazy=false,执行load()函数,34,关联级别检索,关联级别:检索主类相关联的实体或实体集合什么时候载入的策略,关联实体的载入策略(one-to-one或many-to-one),注意: 当关联实体使用fetch=join时,lazy的延迟加载失去意义.,因为连接查询把关联对象同时载入. 关联实体是否延迟加载,还要参考关联实体的类级别载入

17、策略.,35,代码,主类级别检索策略,关联实体的检索策略,关联类的检索策略,36,关联类的载入策略,中lazy属性,只要有一个条件为立即载入,最后关联类立即载入,注意:只要中lazy属性为false,不用判断关联类的lazy属性,最终关联类立即载入; 如果中lazy属性为proxy,还需要判断关联类lazy属性.,37,示例-1,关联类立即加载,主类延迟加载,38,示例-2,关联类立即加载,主类立即加载,39,示例-3,主类延迟加载,关联类延迟加载,40,示例-4,关联类立即加载等同 fetch=“join”,进行左外连接,41,示例-5,进行左外连接,连接操作表示立即加载,42,关联级别检索,(2)关联集合的载入策略(one-to-many或many-to-many) 采用什么载入策略,是由中的lazy属性和fetch属性决定的.,43,示例,关联集合立即载入,44,示例,关联集合延迟加载,调用集合的任何函数时,触发select操作,45,示例,关联集合进一步延迟加载,只有访问到集合中每一个对象才可载入.,46,示例,关联集合延迟载入,subselect检索方式,不受主类

温馨提示

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

评论

0/150

提交评论