数据结构域算法设计-第6章 高级数据检索 课件

上传人:woxinch****an2018 文档编号:57200073 上传时间:2018-10-20 格式:PPT 页数:51 大小:758KB
返回 下载 相关 举报
数据结构域算法设计-第6章  高级数据检索 课件_第1页
第1页 / 共51页
数据结构域算法设计-第6章  高级数据检索 课件_第2页
第2页 / 共51页
数据结构域算法设计-第6章  高级数据检索 课件_第3页
第3页 / 共51页
数据结构域算法设计-第6章  高级数据检索 课件_第4页
第4页 / 共51页
数据结构域算法设计-第6章  高级数据检索 课件_第5页
第5页 / 共51页
点击查看更多>>
资源描述

《数据结构域算法设计-第6章 高级数据检索 课件》由会员分享,可在线阅读,更多相关《数据结构域算法设计-第6章 高级数据检索 课件(51页珍藏版)》请在金锄头文库上搜索。

1、Hibernate ORM 最佳实践 第6章 高级数据检索,2,回顾,使用动态类进行关系映射 使用组件进行关系映射 映射值类型的集合 一个持久化类对应多个表的映射,3,目标,QBC(query by criteria)面向对象查询方式 利用HQL和criteria连接查询 Hibernate的数据检索策略,4,QBC数据检索,HQL示例,class bookprivate 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对象,作为查询条件.Criterion c

3、ond=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,分析-1,Criteria接

4、口中的主要方法 Criteria add(Criterion criterion):添加查询条件,作用where条件.如果说查询条件是多个并列或者是只要满足其中一个条件,怎样实现and或or逻辑操作?如:查询教师ID号=200或者教师姓名不以T或t开头的所有教师.,Criteria addOrder(Order order)增加排序,Criteria createAlias(String associationPath,String alias),关联实体属性名,别名,为对象实体属性设置别名来实现关联,Criteria createAlias(String associationPath,St

5、ring alias,int joinType),CriteriaSpecification.INNER_JOIN, CriteriaSpecification.FULL_JOIN CriteriaSpecification.LEFT_JOIN ,CriteriaSpecification.RIGHT_JOIN,10,示例,查找教师101所带学生姓名为刘的所有学生的学号及姓名,对象实体属性student,11,代码,注意:createAlias()方法不会返回新的实例,还是原来的Criteria 实例,这样设置Teacher与Student的关联关系.,Criteria createCrite

6、ria(String associationPath,String alias),关联实体属性名,返回一个新的Criteria实例,12,代码,产生新的Criteria实例crit1,Criteria setProjection (Projection projection),Projections类提供许多静态方法来产生对查询结果进行选择 某些属性的投影,进行avg、max、min、count、sum等聚集运算。,13,示例,计算学生中来自成都的有多少?,查询来自成都的学生的学号及姓名,14,代码,ProjectionLis:添加投影列,查询返回的list对象中含有对象数组Object ,其

7、中Object0代表sid,Object1代表sname,15,DetachedCriteria类,在前面例子中,在使用Criteria对象的前提必须有一个Session对象,因此这种依赖关系限制Criteria接口的使用范围。 考虑以下情况:需要在没有Session对象的情况下创建数据查询;同一个数据查询跨越多个Session对象 Hibernate提供一个可以脱离Session对象的查询对象:DetachedCriteria,DetachedCriteria.forClass(实体类类型),DetachedCriteria,封装一个 CriteriaImpl对象,getSession( )

8、,session对象,criteria对象(脱离session),criteria.getExecutableCriteria(session),criteria对象(关联session),16,示例,只有关联到session后才可以list,17,小结,18,Criterion类和Restrictions类,1.Criterion 是 Criteria 的查询条件。 2.Criteria 提供了 add(Criterion criterion) 方法来添 加查询条件。 3.Criterion 的实例可以通过 Restrictions 工具类来 创建, Restrictions 提供了大量的静

9、态方法,如 eq (等于)、 ge (大于等于)、 between 等来方法 的创建 Criterion查询条件( SimpleExpression 实例) 4.除此之外,Restrictions 还提供了方法来创建conjunction 和 disjunction 实例,通过往该实例的add(Criteria) 方法来增加查询条件形成一个查询 条件集合。,19,Restrictions类的方法,设置Criterion查询条件,20,Projection和Projections类,1.Projection 主要是让 Criteria 能够进行报表查询,并可以实现分组。 Projection主要

10、有 SimpleProjection 、 ProjectionList 和 Property 三个实现。其中 SimpleProjection 和 ProjectionList 的实例化是由内建的 Projections 来完成,如提供的 avg 、 count 、 max 、 min 、 sum 可以让开发者很容易对某个字段进行统计查询。 2. Property 是对某个字段进行查询条件的设置,如通过 Porperty.forName(“color”).in(new String“black”,”red”,”write”); 则可以创建一个 Criterion实例。 3.通过 criteri

11、a 的 setProjection(Projection) 方法加入到查询条件中去。,21,Projections的方法,SimpleProjection 和 ProjectionList 的 实例化是由内建的 Projections 来完成,22,示例,查询来自成都的学生,并且由101号老师所带的,该学生的学号及姓名,23,逻辑组合,如果逻辑关系比较复杂,可以使用Restrictions.disjunction()代表逻辑或、Restrictions.conjuction()代表逻辑与,查询由表101号老师所带学号范围(602-608)的姓王或姓刘的学生的学号、姓名,24,举例查询(QBE)

12、,使用Example类进行查询,Example 本身提供了一个静态方法 create(Object entity) ,即根据一个对象(实际使用中一般是映射到数据库的对象)来创建。然后可以设置一些过滤条件: Example exampleUser =Example.create(u) .ignoreCase() / 忽略大小写 .enableLike(MatchMode.ANYWHERE); Criteria crit=session.createCriteria(Student.class); crit.add(exampleUser ); List results=crit.list();,

13、ANYWHERE、END、EXACT、START,25,连接查询,三中连接方式:内连接、左外连接、右外连接,内连接:是利用关键字INNER JOIN内联合两个实体对象,只返回满足关键字ON 定义 的条件的记录。 任何不满足条件的记录都会被排除在结果之外;外连接:在整个查询过程中以一个表格为主,另一个表格为辅,主表格中的记录不论是 否满足条件都应该出现在结果集合中,而辅助表格中的记录则必须满足条件。,一、HQL连接查询(inner join 、 left join 、 right join),26,示例,27,list中的每个元素是Object ,其中Object0 是Student对象,Obj

14、ect1是Teacher对象,28,HQL支持fetch查询,在HQL中使用fetch,在返回的list中存放的对象是主类对象,而不是以对象组形式返回关联的两个类对象。,只返回主类对象Student,29,检索策略-类级别,类级别 :关于POJO类什么时候被载入类级别延迟加载(代理检索策略),在编译期间进行字节码增强操作,很少用,当检索一个类,其所有属性 从数据库中检索到session中,当检索一个类,得到是只有 主键属性的代理对象(其它非主键属性为空), 只有在访问非主键属性时,才初始化其他属性, 对象才载入.,类级别延迟加载只是在调用load函数时有用;如果使用get函数,或者使用Quer

15、y.list()执行查询,立即加载类对象; 在POJO的映射文件中增加lazy属性(true|false),默认是延迟加载.,30,示例,类级别延迟加载,cp为代理对象,并没有执行select操作,访问非主属性,触发select操作,31,类级别延迟加载,如果load的对象不存在,在执行load()时是不会发现的,只有在访问非主键属性时才抛出异常;,主键不存在,Load()执行时正常的,没发现id不存在,对象只能在session范围内被加载,如果session关闭了,再返回对象就会抛出异常.,32,示例,提前关闭session,33,示例,类级别延迟对get或Query.list()方法不起作用,立即检索,立即检索,select操作触发,相当于lazy=false,执行load()函数,34,关联级别检索,关联级别:检索主类相关联的实体或实体集合什么时候载入的策略,关联实体的载入策略(one-to-one或many-to-one),注意: 当关联实体使用fetch=join时,lazy的延迟加载失去意义.,因为连接查询把关联对象同时载入. 关联实体是否延迟加载,还要参考关联实体的类级别载入策略.,35,代码,主类级别检索策略,关联实体的检索策略,关联类的检索策略,36,关联类的载入策略,中lazy属性,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号