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. hive记录-cdh配置hive和sentry

    1.cdh添加组件-sentry-选择主机-配置数据库 2.配置数据库 1)mysql -uroot -p 2) create database sentry DEFAULT CHARSET utf8 ...

  2. centos6.5mini版安装及配置

    1.安装选择界面,这个选第一个 2.镜像完整性检查,一般都是跳过SKIP 3.欢迎界面,进入安装了 4.语言选择,这个是没有中文的,用默认的英文就行 5.键盘布局,用默认的us 6.这里会给一个警告, ...

  3. 【转】Linux C下非特定波特率的配置和使用

    https://blog.csdn.net/jinhongdu/article/details/43413071  对于非标准的任意波特率需要用ioctl(fd, TIOCGSERIAL,  p)和i ...

  4. HTML5 离线缓存Appcache

    创建一个和html同名的manifest文件,比如页面为index.html,那么可以建一个index.manifest的文件,然后给index.html的html标签添加如下属性即可: <ht ...

  5. HDU 1022(火车过站 栈)

    题意是给定火车进站的序列和出站的序列,问能否完成转换,若能输出过程. 和另一道以火车进站为背景的栈应用题类似,但增加了对于过程的输出,只需要多记录一下进出站顺序即可. #include <bit ...

  6. solr简介与安装

    solr简介: Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展,并对索引 ...

  7. Mongoose笔记

    Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具 mongoose是针对mongoDB操作的一个对象模型库,封装了mongoDB对文档的.增删改查等方法 使用Ko ...

  8. koa2学习笔记

    Koa -- 基于 Node.js 平台的下一代 web 开发框架 首先创建一个项目文件夹进行初始化 npm init -y 该命令执行后会生成一个package.json项目描述文件 安装koa n ...

  9. Polymer初探

    Polymer是什么? Polymer英文为 n.聚合物:多聚体 网络高分子:聚合体:高分子聚合物 应用在Web组件场景, 表达的是, 一个一个小的Web组件,可以通过此框架聚合为一个 整个页面. h ...

  10. RIPS PHP源码静态分析(转)

    0x00背景 对于PHP代码审计的需求,我们当然需要一款好的php代码审计分析工具--RIPS,它使用了静态分析技术,能够自动化地挖掘PHP源代码潜在的安全漏洞如XSS ,sql注入,敏感信息泄漏,文 ...