Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。

上次课回顾:

l  Hibernate的一对多

n  表与表之间关系

u  一对多关系

u  多对多关系

u  一对一关系

n  Hibernate的一对多配置

u  搭建Hibernate基本环境

u  创建表

u  创建实体

l  一的一方

n  放的是多的一方的集合

l  多的一方

n  放的是一的一方的对象

u  创建映射

l  一的一方

n  配置的集合

l  多的一方

n  配置

u  编写测试类

n  Hibernate的一对多的操作

u  级联操作:cascade,用于操作其关联的对象。

l  级联保存或更新

l  级联删除

u  测试对象导航

u  放弃外键维护权:inverse,用户控制是否有外键维护能力

l  Hibernate的多对多

n  Hibernate的多对多配置

u  搭建Hibernate环境

u  创建表

u  创建实体

l  放置的是对方的集合

u  创建映射

l  配置的是对象的

u  编写测试类

n  Hibernate的多对多操作

u  级联操作

l  级联保存或更新

l  级联删除(了解)

u  其他的操作

l  给用户选择角色

l  给用户改选角色

l  给用户删除角色

 

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第1张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第2张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第3张图片

以一对多为例测试该方式:

首先使用第三天的联系人客户实体及配置 但是取消级联和主键维护的配置。此处略。数据库改为hibernate4 表的创建方式改create

新建测试类:

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第4张图片

初始化30条数据。

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第5张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第6张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第7张图片

为了理解 tosting()客户 但是注意取消联系人集合 因为客户里有联系人联系人里有客户 会成为死循环。

结果:

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第8张图片

注意!!!!!!!!!!

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第9张图片

from Customer 中的Customer可不是表名字 而是实体类的名字。相当于加上包名 com.hibernate.domain.Customer

 

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第10张图片

结果同上。

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第11张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第12张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第13张图片

前两个好理解 第三个封装到对象中 需要先写构造方法。

 Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第14张图片

sql:

 

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第15张图片

 其他都null 只查了那俩属性。

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第16张图片

同理 tosting()一下实体类。

结果:

 

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第17张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第18张图片

结果:

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第19张图片

1.1.1.1   HQL的多表查询

l  SQL的多表查询

n  连接查询

u  交叉连接:笛卡尔积

select * from A,B;

u  内连接     :inner join (inner 可以省略)

l  隐式内连接:

select * from A,B where A.id = B.aid;

l  显示内连接:

select * from A inner join B on A.id = B.aid;

u  外连接     :

l  左外连接:left outer join(outer 可以省略)

select * from A left outer join B on A.id= B.aid;

l  右外连接:right outer join(outer 可以省略)

select * from A right outer join B on A.id = B.aid;

n  子查询

 

l  HQL的多表查询

n  连接查询

u  交叉连接

u  内连接

l  显示内连接

l  隐式内连接

l  迫切内连接

u  外连接

l  左外连接

l  右外连接

 

l  迫切左外连接

 

 Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第20张图片

 

 Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第21张图片

 

 Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第22张图片

fetch的作用:通知hibernate,将另一个对象的数据封装到该对象中  即把联系人装到客户的集合里。(客户tosting要打印联系人)

打印的语句一样:

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第23张图片

联系人集合:

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第24张图片

 执意要用distinct去重 不然如果一个客户有10个联系人  便会有十条记录重复。

 迫切内连接是封装成一个对象 而内连接则是封装成数组(Object)

左外连接和迫切左外连接也一样 注意没有迫切右外连接 因为只要调换两表位置即可。 

 

 Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第25张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第26张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第27张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第28张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第29张图片

第一页数据:

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第30张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第31张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第32张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第33张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第34张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第35张图片

更适合于多重条件查询:图解--》

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第36张图片

结果:

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第37张图片

 

 Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第38张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第39张图片

 

 

 

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第40张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第41张图片

注意要把customer实体类中的tostring中去掉linkman集合。不然会有影响。

 

 Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第42张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第43张图片

 类级别的延迟:

 Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第44张图片

默认lazy为true 及延迟加载 设为false后失效。

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第45张图片

设为false后只对当前类有效 关联对象不影响。关联对象需要另外设置。 以上可打断点进行调试。查看语句何时发送。

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第46张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第47张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第48张图片

------------------------------------------------------------------------------------------》

 

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第49张图片

 

 结果同上:说明默认值就是select true 

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第50张图片

 

 Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第51张图片

会一下发两条语句查询。再查联系人也不会发送了。

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第52张图片

如果查size(),也同上。

但是如果lazy = extra的话 就极其懒惰了。查什么执行什么。查个数就只查个数

 Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第53张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第54张图片

此时lazy会失效,因为迫切左外连接已经查到了全部数据。

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第55张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第56张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第57张图片

然后再查每个客户的所有联系人打印数量的时候不在发送sql:

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第58张图片

注意要查询多个,单独差一个客户的话 不会用in 因为效率不高 会用“=”。

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第59张图片

 

 

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第60张图片

先去掉客户配置文件中的配置。在测试联系人。

 

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第61张图片

 

 Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第62张图片

然后修改配置文件:

 

 在测试:

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第63张图片

效果同上。说明默认值就是如图。

继续:

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第64张图片

不会延迟查询客户。一次性查询。

继续:

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第65张图片

 

 Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第66张图片

注意多的一方 的lazy=proxy的值依赖于一的一方的lazy值 默认一的一方为true 他也为true。

 

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第67张图片

 

 Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第68张图片

 

发送N+1条数据。第一条为查客户 再查联系人。

 而如果配置客户的数量为4 便会提高效率 只发两条sql

 

 

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第69张图片

下面全是联系人:

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第70张图片

 

 

反过来:

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第71张图片

 

 也是先查联系人 再根据每个联系人查客户 也是N+1条数据。

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第72张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第73张图片

 

会先查联系人 再根据所有联系人能对应的外键 查客户 。也就两条数据。默认size=1 所以会一个一个去查 设置数量后会n个n个去查 也就是n个查一次。

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第74张图片

Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。_第75张图片

 

转载于:https://www.cnblogs.com/ttty/p/10728594.html

你可能感兴趣的:(Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。)