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. Docker 容器管理

    单一容器管理 容器的标识符 每个容器被创建后都会分配一个CONTAINER_ID作为容器的唯一标识符,后续的启动.停止等操作都通过CONTAINER_ID来完成的. CONTAINER_ID很难记忆, ...

  2. BIO和NIO

    在了解BIO,NIO,AIO之前先了解一下IO的几个概念:   1.同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous com ...

  3. Golang入门教程(三)beego 框架安装

    beego 是一个快速开发 Go 应用的 HTTP 框架,他可以用来快速开发 API.Web 及后端服务等各种应用,是一个 RESTful 的框架,主要设计灵感来源于 tornado.sinatra ...

  4. VS2017 新建win32控制台应用

    VS2017的Win32应用比较隐蔽添加新项目,选择项目向导,点击下一步即可看到.

  5. AD软件使用心得

    1.在更新原理图之前一定要标记所有器件,否则无法生成PCB器件. 2.学会用sch list网表来批量修改器件名称 3.布线的面

  6. webpack学习笔记——解决多次输出的问题&自动编译之启用观察者模式,热重载

    [解决多次输出的问题] 昨天学会了用命令打包,如下 webpack entry.js bundle.js 但是会出现多次输出要表现的内容的问题,如下,执行几次上述命令,显示几次,原因是并没有清除之前输 ...

  7. 集成JUnit测试错误java.lang.IllegalStateException: Failed to load ApplicationContext

    1 详细错误信息 java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.t ...

  8. MGR架构 ~ 节点的维护相关问题

    一简介:MGR节点的相关维护二 两种情况   1 MGR读节点异常停止,然后重新启动加入节点进行数据同步   2 MGR读节点新加入集群成员,启动复制进行数据同步三 通用过程  1 新加入节点通过通道 ...

  9. python - 爬虫入门练习 爬取链家网二手房信息

    import requests from bs4 import BeautifulSoup import sqlite3 conn = sqlite3.connect("test.db&qu ...

  10. JS 如何将 HTML 页面导出为多页 PDF

    参考链接:https://blog.csdn.net/pwc1996/article/details/70141383