Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。
上次课回顾:
l Hibernate的一对多
n 表与表之间关系
u 一对多关系
u 多对多关系
u 一对一关系
n Hibernate的一对多配置
u 搭建Hibernate基本环境
u 创建表
u 创建实体
l 一的一方
n 放的是多的一方的集合
l 多的一方
n 放的是一的一方的对象
u 创建映射
l 一的一方
n 配置的<set>集合
l 多的一方
n 配置<many-to-one>
u 编写测试类
n Hibernate的一对多的操作
u 级联操作:cascade,用于操作其关联的对象。
l 级联保存或更新
l 级联删除
u 测试对象导航
u 放弃外键维护权:inverse,用户控制是否有外键维护能力
l Hibernate的多对多
n Hibernate的多对多配置
u 搭建Hibernate环境
u 创建表
u 创建实体
l 放置的是对方的集合
u 创建映射
l 配置的是对象的<set>
u 编写测试类
n Hibernate的多对多操作
u 级联操作
l 级联保存或更新
l 级联删除(了解)
u 其他的操作
l 给用户选择角色
l 给用户改选角色
l 给用户删除角色
以一对多为例测试该方式:
首先使用第三天的联系人客户实体及配置 但是取消级联和主键维护的配置。此处略。数据库改为hibernate4 表的创建方式改create
新建测试类:
初始化30条数据。
为了理解 tosting()客户 但是注意取消联系人集合 因为客户里有联系人联系人里有客户 会成为死循环。
结果:
注意!!!!!!!!!!
from Customer 中的Customer可不是表名字 而是实体类的名字。相当于加上包名 com.hibernate.domain.Customer
结果同上。
前两个好理解 第三个封装到对象中 需要先写构造方法。
sql:
其他都null 只查了那俩属性。
同理 tosting()一下实体类。
结果:
结果:
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 迫切左外连接
fetch的作用:通知hibernate,将另一个对象的数据封装到该对象中 即把联系人装到客户的集合里。(客户tosting要打印联系人)
打印的语句一样:
联系人集合:
执意要用distinct去重 不然如果一个客户有10个联系人 便会有十条记录重复。
迫切内连接是封装成一个对象 而内连接则是封装成数组(Object)
左外连接和迫切左外连接也一样 注意没有迫切右外连接 因为只要调换两表位置即可。
第一页数据:
更适合于多重条件查询:图解--》
结果:
注意要把customer实体类中的tostring中去掉linkman集合。不然会有影响。
类级别的延迟:
默认lazy为true 及延迟加载 设为false后失效。
设为false后只对当前类有效 关联对象不影响。关联对象需要另外设置。 以上可打断点进行调试。查看语句何时发送。
------------------------------------------------------------------------------------------》
结果同上:说明默认值就是select true
会一下发两条语句查询。再查联系人也不会发送了。
如果查size(),也同上。
但是如果lazy = extra的话 就极其懒惰了。查什么执行什么。查个数就只查个数
此时lazy会失效,因为迫切左外连接已经查到了全部数据。
然后再查每个客户的所有联系人打印数量的时候不在发送sql:
注意要查询多个,单独差一个客户的话 不会用in 因为效率不高 会用“=”。
先去掉客户配置文件中的配置。在测试联系人。
然后修改配置文件:
在测试:
效果同上。说明默认值就是如图。
继续:
不会延迟查询客户。一次性查询。
继续:
注意多的一方 的lazy=proxy的值依赖于一的一方的lazy值 默认一的一方为true 他也为true。
发送N+1条数据。第一条为查客户 再查联系人。
而如果配置客户的数量为4 便会提高效率 只发两条sql
下面全是联系人:
反过来:
也是先查联系人 再根据每个联系人查客户 也是N+1条数据。
会先查联系人 再根据所有联系人能对应的外键 查客户 。也就两条数据。默认size=1 所以会一个一个去查 设置数量后会n个n个去查 也就是n个查一次。
Hibernate学习第4天--HQL——QBC查询详解,抓取策略优化。的更多相关文章
- Hibernate框架笔记04HQL_QBC查询详解_抓取策略优化机制
目录 1. Hibernate的查询方式 1.1 方式一:OID查询 1.2 方式二:对象导航查询 1.3 方式三:HQL方式 1.4 方式四:QBC查询 1.5 方式五:SQL查询 2. 环境搭建 ...
- ElasticSearch7.3学习(二十)----采用restful风格查询详解
1.Query DSL入门 1.1 DSL DSL:Domain Specified Language,特定领域的语言.es特有的搜索语言,可在请求体中携带搜索条件,功能强大. 查询全部 GET /b ...
- 【Java EE 学习 48】【Hibernate学习第五天】【抓取策略】【二级缓存】【HQL】
一.抓取策略. 1.hibernate中提供了三种抓取策略. (1)连接抓取(Join Fetch):这种抓取方式是默认的抓取方式.使用这种抓取方式hibernate会在select中内连接的方式获取 ...
- 分享知识-快乐自己:Hibernate 中Criteria Query查询详解
1):Hibernate 中Criteria Query查询详解 当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中. 此外,Hibernate还支持Cr ...
- 【Hibernate学习】 —— 抓取策略(注解方式)
当应用程序须要在关联关系间进行导航的时候.hibernate怎样获取关联对象的策略. 抓取策略的方式: FetchType.LAZY:懒载入.载入一个实体时.定义懒载入的属性不会立即从数据库中载入. ...
- Hibernate中的多表查询及抓取策略
1.Hibernate中的多表查询 1.1SQL中的多表查询 [交叉连接] select * from A,B; [内连接] 显示内连接:inner join(inner 可以省略) Select * ...
- hibernate detached分离查询 与 抓取策略注意事项
1.detached在抓取策略为 jion显式左外连接查询情况下 会产生笛卡儿积现象 DetachedCriteria dc = DetachedCriteria.forClass(Topic.cla ...
- Hibernate学习---第十一节:Hibernate之数据抓取策略&批量抓取
1.hibernate 也可以通过标准的 SQL 进行查询 (1).将SQL查询写在 java 代码中 /** * 查询所有 */ @Test public void testQuery(){ // ...
- Hibernate学习笔记(八) — 懒载入与抓取策略
懒载入(Load On Demand)是一种独特而又强大的数据获取方法,它可以在用户滚动页面的时候自己主动获取很多其它的数据,而新得到的数据不会影响原有数据的显示,同一时候最大程度上降低server端 ...
随机推荐
- python开发函数进阶:递归函数
一,什么叫递归 #递归#在一个函数里调用自己#python递归最大层数限制 997#最大层数限制是python默认的,可以做修改#但是我们不建议你修改 例子和尚讲故事 #!/usr/bin/env p ...
- C/S模式客户端连接服务器连接不上的问题
C/S模式客户端连接服务器连接不上的问题 1.服务器电脑防火墙关闭 2.服务器端SQL SERVER2008R: 配置工具--SQL SERVER配置管理器 MSSQLSERVER协议.客户端协议(S ...
- niosII SDRAM ,FLASH (学习特权)
环境: quartus v13.0 64位. DE2 cycloneII EP2C35F672C6N (学校的开发板,还是想同学借的呵呵) 主要实现flash的烧录,虽然实现了但是还是有很多运气的成 ...
- Python Twisted系列教程2:异步编程初探与reactor模式
作者:dave@http://krondo.com/slow-poetry-and-the-apocalypse/ 译者:杨晓伟(采用意译) 这个系列是从这里开始的,欢迎你再次来到这里来.现在我们可 ...
- Delphi IOS 蓝牙锁屏后台运行
Delphi IOS 后台运行 同样的程序,编译成android,锁屏后继续运行正常,蓝牙通讯正常,但在IOS下锁屏后程序的蓝牙就中断通讯了? IOS的机制就是这样,锁屏就关闭了. 音乐播放器是怎么做 ...
- c# 通过dllimport 调用c 动态链接库
https://blog.csdn.net/zhunju0089/article/details/80906501 这篇文件很详细 讲述了如何创建c 动态链接库项目 有一些注意的地方 不做介绍 下面是 ...
- 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 5 Octave Tutorial—5.5 控制语句: for, while, if 语句
5.5 控制语句: for, while, if 语句 参考视频: 5 - 5 - Control Statements_ for, while, if statements (13 min).mkv ...
- consul watch
consul watch -type key -key mhc ./key_handler.py [root@mhc consul]# cat key_handler.py #!/usr/bin/py ...
- 如何学习MySQL
转自高手的帖子 1.坚持阅读官方手册,看MySQL书籍作用不会特别大:(挑选跟工作相关的内容优先阅读,例如InnoDB存储引擎,MySQL复制,查询优化) 2.阅读官方手册,同时对阅读的内容做对应的测 ...
- 关于recv的返回值
通常recv有几种返回值 1.==0 表示收到FIN包, 因为FIN包,是状态为标记为FIN的空包,没有携带数据,所以recv的长度为0 2.>0 表示收到了数据, 但是有没有收完,是不知道的 ...