QBC查询
1.简单查询
Criteria c = s.createCriteria(TeacherModel.class);
2.获取查询结果
多条:list
单挑:uniqueResult
3.分页查询
setFirstResult(int)
setMaxResults(int)
4.查询排序
添加排序
c.addOrder(Order);
排序规则
Order od = Order.asc("字段名")
Order od = Order.desc("字段名")
5.条件查询
1.添加查询条件
c.add(条件)
2.条件格式
Restrictions.操作名称(参数....);
3.组合条件
Restrictions.and(条件1,条件2);
Restrictions.or(条件1,条件2);
Restrictions.not(条件)
6.投影
单独字段
c.setProjection(Property.forName("age"));
多字段
c.setProjection(
Projections.projectionList()
.add(Property.forName("studentName"))
.add(Property.forName("age"))
);
QBC多表查询
1.如果要建立多表查询,首先要告诉QBC是多表
c.createAlias("关联对象","别名");
所有属性,如果是关联对象的属性,统一使用别名调用
//认为: teacher.nick
//实际:别名.nick
2.离线查询
表现层过来的数据,是散的
在表现成中,创建一个DetachedCriteria,然后将所有条件在这里赋值完毕,将它传递到逻辑层
传递到逻辑层
将DetachedCriteria传递到数据层
逻辑层传递数据层
将DetachedCriteria转化为Criteria,使用
-------------------------------
数据加载策略/数据抓取策略
查询方式
load OID
get OID
Query(Query Criteria) SQL
数据分类
主数据
查询TeacherModel->StudentModel
主数据 主关联数据
假设关系:一对多
由一获得多
一:是主数据
多:是主关联数据
由多获得一
多:是从数据
一:是从关联数据

TeacherModel 1 n StudentModel
查询TeacherModel,主
查询TeacherModel,找StudentModel 主关联
查询StudentModel,从
查询StudentModel,找StudentModel 从关联

数据获取方式
load OID
get OID
Query OID
Query 非OID

直接数据加载策略

关联数据加载策略
主关联数据加载策略
老师对学生一对多,这里研究的是老师对象中的学生集合的数据加载策略
1.fetch = "select" lazy = "false"
SQL语句:
主数据:1条SQL
主关链数据:多条SQL
查询主关联数据数据总量
不执行SQL语句
查询主关联数据具体数据
不执行SQL语句
2.fetch = "select" lazy = "true"
SQL语句:
主数据:1条SQL
查询主关联数据数据总量
执行主关联数据对应的具体信息查询SQL(按需产生SQL语句A)
查询主关联数据具体数据
执行主关联数据对应的具体信息查询SQL(按需产生SQL语句A)
3.fetch = "select" lazy = "extra"
SQL语句:
主数据:1条SQL
查询主关联数据数据总量
执行主关联数据集合数据总量查询SQL(按需产生SQL语句A)
查询主关联数据具体数据
执行主关联数据对应的具体信息查询SQL (按需产生SQL语句B)
注意:
先执行A操作,再执行B操作,AB操作均产生SQL语句
先执行B操作,再执行A操作,BA操作只产生B操作SQL语句

4.fetch = "subselect" lazy = "false"
SQL语句:
主数据:1条SQL
主关链数据:1条SQL(子查询)
查询主关联数据数据总量
不执行SQL语句
查询主关联数据具体数据
不执行SQL语句
5.fetch = "subselect" lazy = "true"
SQL语句:
主数据:1条SQL
查询主关联数据数据总量
执行主关联数据对应的具体信息查询SQL(一条子查询SQL语句A)
查询主关联数据具体数据
执行主关联数据对应的具体信息查询SQL(一条子查询SQL语句A)
6.fetch = "subselect" lazy = "extra"
SQL语句:
主数据:1条SQL
查询主关联数据数据总量
执行主关联数据集合数据总量查询SQL(按需产生SQL语句A)
查询主关联数据具体数据
执行主关联数据对应的具体信息查询SQL (一条子查询SQL语句B)
注意:
先执行A操作,再执行B操作,AB操作均产生SQL语句
先执行B操作,再执行A操作,BA操作只产生B操作SQL语句
使用Query查询,携带OID作为查询条件或使用load/get查询,查询SQL生成等同于fetch=select (subselect=select)
7.fetch = "join" lazy = "false"
SQL语句:
主数据:1条SQL
主关链数据:多条SQL
查询主关联数据数据总量
不执行SQL语句
查询主关联数据具体数据
不执行SQL语句
8.fetch = "join" lazy = "true"
SQL语句:
主数据:1条SQL
查询主关联数据数据总量
执行主关联数据对应的具体信息查询SQL (按需产生SQL语句A)
查询主关联数据具体数据
执行主关联数据对应的具体信息查询SQL (按需产生SQL语句A)
9.fetch = "join" lazy = "extra"
SQL语句:
主数据:1条SQL
查询主关联数据数据总量
执行主关联数据集合数据总量查询SQL (按需产生SQL语句A)
查询主关联数据具体数据
执行主关联数据对应的具体信息查询SQL (按需产生SQL语句B)
9-2.fetch = "join" lazy = "extra" 查询使用OID进行
SQL语句:
主数据:1条SQL(左外连接SQL,主和关联数据全部查询出来)
查询主关联数据数据总量
不会产生SQL语句
查询主关联数据具体数据
不会产生SQL语句

fetch:用于控制进行关联查询时,产生的SQL语句
select:一般SQL
subselect:子查询SQL语句
join:Query join=select 一般SQL
OID 左外连接SQL
lazy:用于控制进行关联查询时,被关联数据的加载策略
false:非延迟加载,初期就将数据查询出来
true:延迟加载,需要使用执行SQL
extra:超级延迟加载,如果获取长度,执行SQL与获取数据执行SQL不同

总结:
lazy控制的是关联数据的加载策略,分为理解加载,延迟加载,和超级延迟加载
fetch控制的是SQL语句格式,select一般,subselect子查询,join一般
fetch如果是使用按OID查询,join左外连接SQL

从关联数据加载策略
获取主数据,设置主数据关联的数据加载策略
获取从数据,设置从数据关联的数据加载策略
1.fetch = "select" lazy = "false"
SQL语句:
从数据:1条SQL
从关联数据:多条SQL
查询从关联数据具体数据
不执行SQL
2.fetch = "select" lazy = "proxy" proxy指延迟策略由被关联类控制
SQL语句:
从数据:1条SQL
被关联数据lazy="false" 执行多条SQL
查询从关联数据具体数据
被关联数据lazy="true" 执行从关联数据查询SQL (按需产生SQL语句)
注意:lazy="proxy"将控制权交给被关联对象进行控制
如果被关联对象lazy="true":延迟加载从关联数据
如果被关联对象lazy="false":立即加载从关联数据
3.fetch = "join" lazy = "false"
SQL语句:
从数据:1条SQL
从关联数据:多条SQL
查询从关联数据具体数据
不执行SQL
4.fetch = "join" lazy = "proxy"
SQL语句:
从数据:1条SQL
被关联数据lazy="false" 执行多条SQL
查询从关联数据具体数据
被关联数据lazy="true" 执行从关联数据查询SQL (按需产生SQL语句)
注意:lazy="proxy"将控制权交给被关联对象进行控制
如果被关联对象lazy="true":延迟加载从关联数据
如果被关联对象lazy="false":立即加载从关联数据
注意:当使用OID进行查询时,生成的SQL是左外连接格式,此时lazy失效

fetch:用于控制进行关联查询时,产生的SQL语句
select:一般SQL
join:Query join=select 一般SQL
OID 左外连接SQL
lazy:用于控制进行关联查询时,被关联数据的加载策略
false:非延迟加载,初期就将数据查询出来
proxy:根据从关联数据的lazy属性来决定延迟加载策略

在进行非延迟加载策略搜索时,往往会生成多条SQL语句,可以通过调整批量抓取策略,提高执行效率
batch-size = 4

---------------------------------------
二级缓存
缓存的作用:
H3支持两种缓存
一级缓存
对应Session对象
二级缓存
对相SessionFactory对象
二级缓存操作
load/get
先查找一级缓存,有,返回,没有
再查找二级缓存,有,保存到一级缓存,由一级缓存返回,没有
再查找数据库,SQL,保存到一级缓存,一级缓存将数据保存到二级缓存,一级缓存返回
SQL查询
查找数据库,SQL,保存到一级缓存,一级缓存将数据保存到二级缓存,一级缓存返回
添加数据
更新所在一级缓存的数据
更新数据库对应数据
删除、修改数据
更新所在一级缓存的数据
更新所在二级缓存的数据
更新数据库对应数据

二级缓存操作注意事项
1.SQL查询不走二级缓存
2.不要将所有数据装入二级缓存
3.二级缓存获取数据按OID获取
4.从数据库查询的信息全部进入二级缓存

二级缓存中的数据需要具备什么条件
适合加入二级缓存的数据
很少被修改的数据
不是很重要的数据,允许出现偶尔并发的数据
不会被并发访问的数据
参考数据
不适合加入二级缓存的数据
经常被修改的数据
财务数据,绝对不允许出现并发
与其他应用共享的数据

hibernate框架学习第六天:QBC、分页查询、投影、数据加载策略、二级缓存的更多相关文章

  1. Entity Framework关联查询以及数据加载(延迟加载,预加载)

    数据加载分为延迟加载和预加载 EF的关联实体加载有三种方式:Lazy Loading,Eager Loading,Explicit Loading,其中Lazy Loading和Explicit Lo ...

  2. Entity Framework学习笔记(五)----Linq查询(2)---贪婪加载

    请注明转载地址:http://www.cnblogs.com/arhat 在上一章中,我们使用了Linq对Entity Framework进行了一个查询,但是通过学习我们却发现了懒加载给我来的性能上的 ...

  3. EasyUi 分页 和 表格数据加载

    这里说明的是将说有数据先返回到前端再由前端去分页,性能可能没有先在后台分好页再返回给前端高 但如果操作不涉及大数据的话也没什么大问题,具体问题具体分析 要使用分页控件首先要声明初始化一下: //设置分 ...

  4. hibernate框架学习之多表查询helloworld

    package cn.itcast.h3.hql; import java.util.List; import org.hibernate.Query; import org.hibernate.Se ...

  5. hibernate框架学习之使用SQLQuery查询数据

    SQLQuery对象的获取 Hibernate支持使用原生SQL语句进行查询,通过session对象获得SQLQuery对象进行,需要传入SQL语句 SQLQuery createSQLQuery(S ...

  6. Hibernate框架学习笔记

      Hibernate 是一个 JDO( Java Data Objects)工具.它的工作原理是通过文件把值对象(Java对象)和 数据库表之间建立起一个映射关系,还提供数据查询和获取数据的方法. ...

  7. hibernate框架学习之数据抓取(加载)策略

    Hibernate获取数据方式 lHibernate提供了多种方式获取数据 •load方法获取数据 •get方法获取数据 •Query/ Criteria对象获取数据 lHibernate获取的数据分 ...

  8. hibernate框架学习第三天:对象状态、一级缓存、快照等

    对象的状态 瞬时状态: 瞬时对象(TO) 应用程序创建出来的对象,不受H3控制 注意:TO对象不具有OID,一旦为TO赋值OID,那么此时就不是TO 持久化状态:持久化对象(PO) 受H3控制的对象, ...

  9. Hibernate 加载策略得总结

    Hibernate 加载策略得总结 加载策略(优化查询): 策略种类: 延迟加载: 等到使用的时候才会加载数据. 立即加载: 不管使用不使用,都会立刻将数据加载. 策略的应用: 类级别的加载策略. 关 ...

随机推荐

  1. springboot下整合redis使用redisTemplate模板

    pom <!-- 引入 redis 依赖 --> <dependency> <groupId>org.springframework.boot</groupI ...

  2. tomcat如何访问非webapp下的资源文件

    只要在%tomcathome%\conf\server.xml文件,在标签中加入文件中加入如下代码即可: <Host name="localhost" appBase=&qu ...

  3. Linux防火墙开放端口

    # vi /etc/sysconfig/iptables-A INPUT -m state --state NEW -m tcp -p tcp --dport -j ACCEPT -A INPUT - ...

  4. gcc编译出现dlopen、dlerror、dlsym、dlcolse的解决方法

      ➜  test_sqlite3 gcc *.c -I . -o xixi -pthread      /tmp/cckGKTrr.o: In function `unixDlOpen': sqli ...

  5. idea创建父子工程

    第一步:创建一个新的父工程father:file—–>new—->project ,注意要选maven,Create from archetype不要勾选.next填写GroupId .A ...

  6. bzoj千题计划320:bzoj4939: [Ynoi2016]掉进兔子洞(莫队 + bitset)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4939 ans= r1-l1+1 + r2-l2+1 +r3-l3+1 - ∑ min(cnt1[i ...

  7. Mac OS X 启用超级用户 sudo -s 获得系统权限 Mac终端命令

    为了防止误操作破坏系统,用户状态下时没有权限操作系统重要文件, 所以先要取得root权限:“sudo -s” 详见:https://www.jianshu.com/p/138b98e662ed

  8. ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树

    五.KMP算法:    *KMP算法是一种改进的字符串匹配算法.    *KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是实现一个next()函 ...

  9. 完美解决idea继承maven后,构建项目慢的问题

    1.修改远程仓库的位置(maven默认仓库是国外,所以我们下载jar包很慢) 找到我们安装的maven路径下的conf文件夹下的settings.xml文件 将文件复制到 C:\Users\Admin ...

  10. MVC中的分部视图

    背景: 项目的工期马上就要到了,由于后台封装的很好,我们只需要用心熟悉框架,接下来后台的工作就是简单的代码工作了.原本以为最困难的时期已经过去,可没想到前台才是最困难的. B/S的基础十分薄弱,加上B ...