本帖最后由 htb52110 于 2018-1-15 20:11 编辑
13、Hibernate检索方式概述
Hibernate提供以下几种检索对象方式:
1导航对象图检索方式,根据已加载的对象导航到其它对象
2.OID检索方式,按照对象的OID来检索对象
3.HQL检索方式,使用面向对象的HQL查询语言
4.QBC检索方式,使用QBC(Query by Criteria)API来检索对象,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口
5.本地SQL检索方式,使用本地数据库的SQL查询语句
13.1、导航对象图检索
Customer c=session.get(Customer.class,2);
c.getOrders().size()
通过在hibernate中进行映射关系,在hibernate操作时,可以通过导航方式得到
其关联的持久化对象信息。
13.2、OID检索方式
Session.get(Customer.class,3);
Session.load(Order.class,1);
Hibernate中通过get/load方法查询指定的对象,要通过OID来查询。
13.3、HOL检索方式
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查询。
基本步骤:
- 得到Session
- 编写HQL语句
- 通过session.createQuery(hql)创建一个Query对象
- 为Query对象设置条件参数
- 执行list查询所有,它反胃的是List集合 uniqueResut()返回一个查询结果。
13.3.1、准备数据
13.3.2、基本检索
From 类名;
13.3.3、排序检索
13.3.4、条件检索
13.3.5、分页检索
13.3.6、分组统计检索
分组 group by
统计 count max min avg sum
13.3.7、投影检索
主要讲解是关于部分属性查询,可以使用投影将部分属性封装到对象中。
注意:我们必须在PO类中提供对应属性的构造方法,也要有无参数构造。
13.3.8、命名检索
我们可以将hql语句先定义出来,在使用时通过ession.getNamedQuery(hqlName);得到一个Query,在执行.
hql定义的位置
1.如果你有hbm配置文件,那么当前的hql操作是对哪一个实体进行操作,就在哪一个 实体的配置文件中声明。
2.如果是使用注解来描述PO的配置我们直接在PO类中使用
使用:
13.4、QBC
QBC(query by criteria),它是一种更加面向对象的检索方式。
QBC步骤:
1、通过Session得到一个Criteria对象 session.createCriteria()
2、设定条件 Criterion实例 它的获取可以通过Restrictions类提供静态。
Criteria的add方法用于添加查询条件
3、调用list进行查询 criterfia.list.
13.4.1、基本检索
13.4.2、排序检索
注意在criteri.addOrder()方法的参数使用的Order是hibernate中的对象
13.4.3、条件检索
13.4.4、分页检索
13.4.5、统计分组检索
Count sum avg max min
133.5.4.6、离线检索
13.5、本地SQL
本地sql也支持命名查询。
可以将sql语句定义在hbm文件中,也可以使用注解。
本地命名sql注解定义
如果执行这个命名的sql会产生异常
出现问题的原因:是hibernate不知道执行select * from t_customer后如果将结果封装。
13.6、多表操作
13.6.1、SQL多表操作
1.交叉连接 CROSS JOIN 会产生迪卡尔积
SELECT * FROM t_customer CROSS JOIN t_order;
2.内连接 INNER JOIN ON
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;
3.外连接 左外LEFT OUTER JOIN 右外RIGHT OUTER JOIN
OUTER可以省略
SELECT * FROM t_customer c LEFT OUTER JOIN t_order o ON c.id=o.c_customer_id;
13.6.2、HQL多表操作
Hql多表操作分类:
交叉连接
内连接
显示内连接
隐式内连接
迫切内连接
外连接
左外连接
迫切左外连接
右外连接
注意:在hibernate中有迫切连接的概念,而sql中没有。
内连接:
显示内连接
显示内连接使用的是inner join with
隐式内连接
隐式内连接也我们在sql中操作不一样,它是通过”.”运算符来关联
迫切内连接
迫切内连接得到的结果是直接封装到PO类中,而内连接得到的是Object[]数组,数组中封装的是PO类对象。
外连接
14、事务管理
Hibernate提供了三种管理session的方式:
- Session对象的生命周期与本地线程绑定(ThreadLocal)
- Session对象的生命周期与JTA事务绑定(分布式事务管理)
- Hibernate委托程序来管理Session的生命周期
我们之前所使用的是第三种 ,通过程序获取一个Session对象,使用它,最后session.close();
在实际开发中我们一般使用的是前两种:
主要介绍关于本地线程绑定Session。
步骤:
a、需要在hibernate.cfg.xml文件配置
b、在获取session时不要在使用openSession而是使用getCurrentSession()方法
关于getCurrentSession使用时的注意事项:
上述代码执行后,会产生问题
原因:使用getCurrentSession获取的与线程绑定的session对象,在事务关闭时,session对象也会close,简单说,就不需要我们在手动close; |
|