Hibernate提供以下几种检索对象方式:
1导航对象图检索方式,根据已加载的对象导航到其它对象
2.OID检索方式,按照对象的OID来检索对象
3.HQL检索方式,使用面向对象的HQL查询语言
4.QBC检索方式,使用QBC(Query by Criteria)API来检索对象,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口
5.本地SQL检索方式,使用本地数据库的SQL查询语句
1.1. 导航对象图检索方式
Customer c=session.get(Customer.class,2);
c.getOrders().size()
通过在hibernate中进行映射关系,在hibernate操作时,可以通过导航方式得到
其关联的持久化对象信息。
1.2. OID检索方式
Session.get(Customer.class,3);
Session.load(Order.class,1);
Hibernate中通过get/load方法查询指定的对象,要通过OID来查询。
1.3. HQL
HQL是我们在hibernate中是常用的一种检索方式。
HQL(Hibernate Query Language)提供更加丰富灵活、更为强大的查询能力
因此Hibernate将HQL查询方式立为官方推荐的标准查询方式,HQL查询在涵盖Criteria查询的所有功能的前提下,提供了类似标准SQL语 句的查询方式,同时也提供了更加面向对象的封装。完整的HQL语句形式如下: Select/update/delete…… from …… where …… group by …… having …… order by …… asc/desc 其中的update/delete为Hibernate3中所新添加的功能,可见HQL查询非常类似于标准SQL查询。
基本步骤:
1. 得到Session
2. 编写HQL语句
3. 通过session.createQuery(hql)创建一个Query对象
4. 为Query对象设置条件参数
5. 执行list查询所有,它反胃的是List集合 uniqueResut()返回一个查询结果。
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143125a5ebbebv5edv66gv.png.thumb.jpg)
From 类名;
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143147m9k8g0841ifo0ki0.png.thumb.jpg)
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143207rymvqlpfv4j222rp.png.thumb.jpg)
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143226kkxgdkvg8kkyqvdi.png.thumb.jpg)
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143246nobtzdzbitoh4t4j.png.thumb.jpg)
分组 group by
统计 count max min avg sum
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143306x7o5k0ie9gjqreqt.png.thumb.jpg)
我们主要讲解是关于部分属性查询,可以使用投影将部分属性封装到对象中。
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143326fosu1xa8xc851e1q.png.thumb.jpg)
注意:我们必须在PO类中提供对应属性的构造方法,也要有无参数构造。
我们可以将hql语句先定义出来,在使用时通过session.getNamedQuery(hqlName);得到一个Query,在执行.
问题:hql定义在什么位置?
1.如果你有hbm配置文件,那么当前的hql操作是对哪一个实体进行操作,就在哪一个 实体的配置文件中声明。
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143345vez4w4bu8swmzbbb.png.thumb.jpg)
2.如果是使用注解来描述PO的配置
我们直接在PO类中使用
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143407h2z1v1sxbo7covo1.png.thumb.jpg)
如何使用?
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143432xj3r8dsffoffwsbs.png.thumb.jpg)
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143440d7p7ji77dknup7do.png.thumb.jpg)
QBC(query by criteria),它是一种更加面向对象的检索方式。
QBC步骤:
1.通过Session得到一个Criteria对象 session.createCriteria()
2.设定条件 Criterion实例 它的获取可以通过Restrictions类提供静态。
Criteria的add方法用于添加查询条件
1. 调用list进行查询 criterfia.list.
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143459fp7j9jomzoj76w4o.png.thumb.jpg)
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143516yq7za77eq476jxa5.png.thumb.jpg)
注意在criteri.addOrder()方法的参数使用的Order是hibernate中的对象
条件检索
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143533w1gqgqczn4yqg9ez.png.thumb.jpg)
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143549xqhfiqioqfqo1j1f.png.thumb.jpg)
Count sum avg max min
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143606xwlmz0tm6mssilll.png.thumb.jpg)
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143623m0f9wcedwh99zc1h.png.thumb.jpg)
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143643yzynt86bz6ywys46.png.thumb.jpg)
本地sql也支持命名查询。
可以将sql语句定义在hbm文件中,也可以使用注解。
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143700urh6yzlxur026ld1.png.thumb.jpg)
本地命名sql注解定义
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143718h4me5zj0jor2lndl.png.thumb.jpg)
如果执行这个命名的sql会产生异常
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143744rai7k2qcuk7qqvs7.png.thumb.jpg)
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143755nieejxpzu61w32ud.png.thumb.jpg)
出现问题的原因:是hibernate不知道执行select * from t_customer后如果将结果封装。
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143811gktiehznttccifgr.png.thumb.jpg)
SELECT * FROM t_customer CROSS JOIN t_order;
SELECT * FROM t_customer AS c INNER JOIN t_order AS o ON c.id=o.c_customer_id;
使用内连接它只能将有关联的数据得到。
隐式内连接 使用 "逗号"将表分开,使用WHERE来消除迪卡尔积
SELECT * FROM t_customer AS c ,t_order o WHERE c.id=o.c_customer_id;
OUTER可以省略
SELECT * FROM t_customer c LEFT OUTER JOIN t_order o ON c.id=o.c_customer_id;
HQL多表操作
Hql多表操作分类:
1. 交叉连接
2. 内连接
a) 显示内连接
b) 隐式内连接
c) 迫切内连接
3. 外连接
左外连接
迫切左外连接
右外连接
注意:在hibernate中有迫切连接的概念,而sql中没有。
内连接
显示内连接
显示内连接使用的是inner join with
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143834wopabbbwhdhgquku.png.thumb.jpg)
隐式内连接
隐式内连接也我们在sql中操作不一样,它是通过”.”运算符来关联
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143850dzd5urfy72272j1i.png.thumb.jpg)
迫切内连接
迫切内连接得到的结果是直接封装到PO类中,而内连接得到的是Object[]数组,数组中封装的是PO类对象。
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143907eiki0rv4ik9099pp.png.thumb.jpg)
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143932fdm0oa4f4odo0qqq.png.thumb.jpg)
![](http://bbs2.itheima.com/data/attachment/forum/201806/15/143941ewwaq9f8aqmmaaam.png.thumb.jpg)