上次课回顾:

Hibernate的一对多

表与表之间关系

一对多关系

多对多关系

一对一关系

Hibernate的一对多配置

搭建Hibernate基本环境

创建表

创建实体

一的一方

放的是多的一方的集合

多的一方

放的是一的一方的对象

创建映射

一的一方

配置的<set>集合

多的一方

配置<many-to-one>

编写测试类

Hibernate的一对多的操作

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

级联保存或更新

级联删除

测试对象导航

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

Hibernate的多对多

Hibernate的多对多配置

搭建Hibernate环境

创建表

创建实体

放置的是对方的集合

创建映射

配置的是对象的<set>

编写测试类

Hibernate的多对多操作

级联操作

级联保存或更新

级联删除(了解)

其他的操作

给用户选择角色

给用户改选角色

给用户删除角色

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

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

新建测试类:

初始化30条数据。

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

结果:

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

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

结果同上。

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

sql:

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

同理 tosting()一下实体类。

结果:

结果:

1.1.1.1   HQL的多表查询

SQL的多表查询

连接查询

交叉连接:笛卡尔积

select * from A,B;

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

隐式内连接:

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

显示内连接:

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

外连接     :

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

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

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

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

子查询

HQL的多表查询

连接查询

交叉连接

内连接

显示内连接

隐式内连接

迫切内连接

外连接

左外连接

右外连接

迫切左外连接

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查询详解,抓取策略优化。的更多相关文章

  1. Hibernate框架笔记04HQL_QBC查询详解_抓取策略优化机制

    目录 1. Hibernate的查询方式 1.1 方式一:OID查询 1.2 方式二:对象导航查询 1.3 方式三:HQL方式 1.4 方式四:QBC查询 1.5 方式五:SQL查询 2. 环境搭建 ...

  2. ElasticSearch7.3学习(二十)----采用restful风格查询详解

    1.Query DSL入门 1.1 DSL DSL:Domain Specified Language,特定领域的语言.es特有的搜索语言,可在请求体中携带搜索条件,功能强大. 查询全部 GET /b ...

  3. 【Java EE 学习 48】【Hibernate学习第五天】【抓取策略】【二级缓存】【HQL】

    一.抓取策略. 1.hibernate中提供了三种抓取策略. (1)连接抓取(Join Fetch):这种抓取方式是默认的抓取方式.使用这种抓取方式hibernate会在select中内连接的方式获取 ...

  4. 分享知识-快乐自己:Hibernate 中Criteria Query查询详解

    1):Hibernate 中Criteria Query查询详解 当查询数据时,人们往往需要设置查询条件.在SQL或HQL语句中,查询条件常常放在where子句中. 此外,Hibernate还支持Cr ...

  5. 【Hibernate学习】 —— 抓取策略(注解方式)

    当应用程序须要在关联关系间进行导航的时候.hibernate怎样获取关联对象的策略. 抓取策略的方式: FetchType.LAZY:懒载入.载入一个实体时.定义懒载入的属性不会立即从数据库中载入. ...

  6. Hibernate中的多表查询及抓取策略

    1.Hibernate中的多表查询 1.1SQL中的多表查询 [交叉连接] select * from A,B; [内连接] 显示内连接:inner join(inner 可以省略) Select * ...

  7. hibernate detached分离查询 与 抓取策略注意事项

    1.detached在抓取策略为 jion显式左外连接查询情况下 会产生笛卡儿积现象 DetachedCriteria dc = DetachedCriteria.forClass(Topic.cla ...

  8. Hibernate学习---第十一节:Hibernate之数据抓取策略&批量抓取

    1.hibernate 也可以通过标准的 SQL 进行查询 (1).将SQL查询写在 java 代码中 /** * 查询所有 */ @Test public void testQuery(){ // ...

  9. Hibernate学习笔记(八) — 懒载入与抓取策略

    懒载入(Load On Demand)是一种独特而又强大的数据获取方法,它可以在用户滚动页面的时候自己主动获取很多其它的数据,而新得到的数据不会影响原有数据的显示,同一时候最大程度上降低server端 ...

随机推荐

  1. 【phonegap】IOS按HOME键,程序进入suspended状态,再调出,界面出现文字丢失问题

    发现丢失的都是时间类型的,把日期型改成 yyyy年mm月dd日 时间从冒号表示(12:00)改成中文表示,12点00分,就不再丢失了. 未找到真正原因

  2. python's twenty-seventh day for me 模

    time模块: 1,计算执行代码的时间 time.time() 2,让程序停这里一段时间 time.sleep(时间(s)) 时间戳时间: import time print(time.time()) ...

  3. 15 更多jQuery知识

    jqueryUI 官网: https://jqueryui.com/ jqueryUI 中文网: http://www.jqueryui.org.cn/ jquery插件内容包含 官网demo: ht ...

  4. 【整理】Android中的gravity和layout_gravity区别

    [背景] 在Android中,想要设置个按钮的水平对齐,都累死了: [已解决]ADT中已设置TableLayout布局的情况下如何设置按钮居中对齐    所以现在有必要搞清楚,到底gravity和la ...

  5. 自定义对话框<转>

    效果如下: <ignore_js_op> QQ截图20130221234404.png (51.02 KB, 下载次数: 126) 下载附件  保存到相册 2013-2-21 23:44 ...

  6. java三元运算符详解

    最近在带领实习生中遇到很多新手问与三元运算符有关的java题目,多数为代码结果题,少数为应用题.鉴于很多资料上对于java三元运算的讲解过于简单,网上的资料与题目也不是很完善,对于结果答案分析不一,故 ...

  7. PHP 获取二维数组中某个key的集合

    本文为代码分享,也是在工作中看到一些“大牛”的代码,做做分享. 具体是这样的,如下一个二维数组,是从库中读取出来的. 代码清单: $user = array( 0 => array( 'id'  ...

  8. Lambda01 编程范式、lambda表达式与匿名内部类、函数式接口、lambda表达式的写法

    1 编程范式 主要的编程范式有三种:命令式编程,声明式编程和函数式编程. 1.1 命令式编程 关注计算机执行的步骤,就是告诉计算机先做什么后做什么 1.2 声明式编程 表达程序的执行逻辑,就是告诉计算 ...

  9. 258. Add Digits 数位相加到只剩一位数

    [抄题]: Given a non-negative integer num, repeatedly add all its digits until the result has only one ...

  10. 面试题:Java程序员最常用的20%技术 已看1

    首先常用api(String,StringBuffer/StringBuilder等) 1.集合类,线程类 2.Servlet(很少用纯粹的servlet写,但你要懂,因为很多框架都是基于servle ...