Hibernate学习(三)
Hibernate的查询方法(五种)
一、OID查询:按主键查询
--get( )
--load( )
二、对象导航查询:通过已经查询到的联系人,得到起关联的对象
三、SQL查询
四、HQL查询(***)
1、String hql = “ 查询语句”
Query query = session.createQuery( ) ; // 得到query对象
(1)简单查询
hql = “from Customer”;//查询Customer所有信息
List<Customer> list = query.list( ) ;//得到一个List集合,通过遍历即可
(2)排序查询:默认升序
hql = “from Customer order by 属性名 ASC(升)/DESC(降序)”
List<Customer> list = query.list( ) ;//得到一个List集合,通过遍历即可
(3)条件查询
a、hql = “form Customer where 属性名= ?(and/or ,,,,,,)”
query.setParameter(0 , 属性值):0表示第一个问号
b、名称绑定
hql = “form Customer where 属性名= : a(and/or ,,,,,,)”(冒号 + 名称(任意))
query.setParameter(a , 属性值):a表示名称
(4)投影查询:查询特定的属性
例如:查询所有客户的名称
a、使用别名.属性,返回一个类型为Object的集合
hql = “select c.cust_name(,c.cust_source可以多个) from Customer c”
List<Object> list = query.list( ) ;//得到一个List集合,通过遍历即可,Object更通用
b、使用构造函数,在持久化类中创建一个构造函数,返回值类型为Customer
hql = “ select new Customer(cust_name, cust_source) from Customer”
List<Customer> list = query.list( ) ;//得到一个List集合,通过遍历即可
(5)分页查询
query.setFirstResult( 0) : 表数据的第1 行开始
query.setMaxResult( 0) : 每一页共10 行
(6)分组查询:
用聚合函数:count( ) max( ) min( ) 结合 group by
select 属性名,count(*) from Customer group by 属性名
(7)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的多表查询
内连接
显示内连接
隐式内连接
迫切内连接
外连接
左外连接
右外连接
迫切左外连接
五、QBC查询:Query By Criteria(完全面向对象查询)
1、得到一个Criteria 对象
Criteria c = session.createCriteria(Customer.class)
2、查询所有 c.list( )
3、排序查询 c.addOrder(order.asc/desc( 属性名))
4、分页查询 c.setFirstResult( 0) : 表数据的第1 行开始
c.setMaxResult( 0) : 每一页共10 行
5、条件查询
c.add(Restriction.eq(属性名,属性值)):查询名=值
eq = and
gt > like
ge >= or
lt <
le <=
需要多添加查询就在add( )
6、离散条件查询(DetachedCriteria): 隔离session的查询
DetachedCriteria dc = DetachedCriteria.forClass(Customer.class);
设置条件
dc. add(Restriction.eq(属性名,属性值))
Hibernate的抓取策略(优化)
1、什么是延迟加载
延迟加载:lazy(懒加载)。执行到该行代码的时候,不会发送语句去进行查询,在真正使用这个对象的属性的时候才会发送SQL语句进行查询。
2、延迟加载的分类
(1)类级别的延迟加载: 指的是通过load方法查询某个对象的时候,是否采用延迟。session.load(Customer.class,1l);
类级别延迟加载通过<class>上的lazy进行配置
如果让lazy失效,
-- 将lazy设置为false
-- 将持久化类使用final修饰
-- Hibernate. Initialize()
(2)关联级别的延迟加载:指的是在查询到某个对象的时候,查询其关联的对象的时候,是否采用延迟加载。
Customer customer = session.get(Customer.class,1l);
customer.getLinkMans();----通过客户获得联系人的时候,联系人对象是否采用了延迟加载,称为是关联级别的延迟。
抓取策略往往会和关联级别的延迟加载一起使用,优化语句。
3 抓取策略的概述
通过一个对象抓取到关联对象需要发送SQL语句,SQL语句如何发送,发送成什么样格式通过策略进行配置。通过<set>或者<many-to-one>上
通过fetch属性进行设置 fetch和这些标签上的lazy如何设置优化发送的SQL语句
3.1 <set>上的fetch和lazy
fetch:抓取策略,控制SQL语句格式
--select :默认值,发送普通的select语句,查询关联对象
--join :发送一条迫切左外连接查询关联对象
--subselect :发送一条子查询查询其关联对象
lazy:延迟加载,控制查询关联对象的时候是否采用延迟
--- true :默认值,查询关联对象的时候,采用延迟加载
---false :查询关联对象的时候,不采用延迟加载
---extra :极其懒惰。
在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join。
3.2 <many-to-one>上的fetch和lazy
fetch :抓取策略,控制SQL语句格式。
--select :默认值,发送普通的select语句,查询关联对象。
--join :发送一条迫切左外连接。
lazy :延迟加载,控制查询关联对象的时候是否采用延迟。
--proxy :默认值,proxy具体的取值,取决于另一端的<class>上的lazy的值。
--false :查询关联对象,不采用延迟。
--no-proxy :(不会使用)
在实际开发中,一般都采用默认值。如果有特殊的需求,可能需要配置join。
4、 批量抓取
4.1什么是批量抓取?指一批关联对象一起抓取,batch-size
Hibernate学习(三)的更多相关文章
- hibernate学习三(使用Annotation,注解)
一.新建一个工程hibernate_02_HelloWorld_Annotation(复制01工程并重命名); 二.新建一个实体类teacher.java,数据库中新建teacher表; import ...
- hibernate学习(三) hibernate中的对象状态
hibernate对象的状态分为三种: 游离状态,持久化状态,瞬时状态 下面一行代码区分: Configuration cfg=new Configuration().configure(); ...
- Hibernate学习(三)自动建表
一般情况下有如下两种方法: 1.在配置文件中添加如下配置 <property name="hibernate.hbm2ddl.auto">create</prop ...
- Hibernate学习三----------session详解
© 版权声明:本文为博主原创文章,转载请注明出处 如何获取session对象 1. openSession 2. getCurrentSession - 如果使用getCurrentSession需要 ...
- hibernate学习三 精解Hibernate之核心文件
一 hibernate.cfg.xml详解 1 JDBC连接: 2 配置C3P0连接池: 3 配置JNDI数据源: 4 可选的配置属性: 5 hibernate二级缓存属性 6 hibernate事务 ...
- Hibernate学习2--对象的三种状态以及映射关系的简单配置
上篇hibernate的博客总体简单梳理了对象持久化的一些思想以及hibernate中对象持久化化的方法,下面说说对象持久化过程的三种状态. 一.hibernate缓存的概念 1.session与缓存 ...
- Hibernate学习之——搭建log4j日志环境
昨天讲了Hibernate开发环境的搭建以及实现一个Hibernate的基础示例,但是你会发现运行输出只有sql语句,很多输出信息都看不见.这是因为用到的是slf4j-nop-1.6.1.jar的实现 ...
- Hibernate学习笔记(二)
2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...
- [原创]java WEB学习笔记88:Hibernate学习之路-- -Hibernate检索策略(立即检索,延迟检索,迫切左外连接检索)
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [原创]java WEB学习笔记87:Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
随机推荐
- Luogu P4248 [AHOI2013]差异
题目链接 \(Click\) \(Here\) 神仙题.或者可能我太菜了没见过后缀数组的骚操作,然后就被秀了一脸\(hhhhh\) \[\sum\limits_{1<=i < j < ...
- (大数 string easy。。。)P1781 宇宙总统 洛谷
题目背景 宇宙总统竞选 题目描述 地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统. 输入输出格式 输入格式: pr ...
- pstack跟踪进程栈
一:简介 这个命令可以显示每个进程的栈跟踪.pstack命令必须由相应进程的宿主或root运行.可以使用pstack来确定进程挂起的位置.此命令允许使用唯一选项就是进程的PID 这个命令在排查进程问题 ...
- Http如何利用304让浏览器去更新数据
ETag 是 Entity Tag 的缩写,中文译过来就是实体标签的意思.在HTTP1.1协议中其实就是请求HEAD中的一个属性而已. HTTP/1.1 200 OK Date: Mon, 23 Ma ...
- Ipython Notebook ipynb文件转化为Python脚本
欢迎关注博主主页,学习python视频资源 方法1. pycharm可以打开 方法2 https://jingyan.baidu.com/article/19192ad8edc736e53e57072 ...
- Linux进程和任务管理
process 进程 进程-线程等 Job 前台--后台: 后台任务"与"前台任务"的本质区别只有一个:是否继承标准输入 联机--脱机 -以及crontab 脱机管理主要 ...
- 19.职责链模式(Chain of Responsibility Pattern)
19.职责链模式(Chain of Responsibility Pattern)
- python 管道 事件(Event) 信号量 进程池(map/同步/异步)回调函数
####################总结######################## 管道:是进程间通信的第二种方式,但是不推荐使用,因为管道会导致数据不安全的情况出现 事件:当我运行主进程的 ...
- BFC规范
BFC规范 BFC规范是什么? BFC规范也叫块级格式化上下文.是指一个独立的容器. 如何触发BFC? 我们可以通过一下几种方式触发BFC 1.通过浮动触发:float(除none) 2.通过绝对\固 ...
- MarkdownPad使用
正文: 1.标题的几种写法: 第一种: 前面带#号,后面带文字,分别表示h1-h6,上图可以看出,只到h6,而且h1下面会有一条横线,注意,#号后面有空格 第二种: 这种方式好像只能 ...