多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 简介 对数据库操作中,最常用的是select.使用hibernate如何select操作。 分为五种: 1导航对象图检索方式,根据已加载的对象导航到其它对象 2.OID检索方式,按照对象的OID来检索对象 3.HQL检索方式,使用面向对象的HQL查询语言 4.QBC检索方式,使用QBC(Query by Criteria)API来检索对象,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口 5.本地SQL检索方式,使用本地数据库的SQL查询语句 # 导航对象图检索方式 ~~~ Customer c=session.get(Customer.class,2); c.getOrders().size() ~~~ 通过在hibernate中进行映射关系,在hibernate操作时,可以通过导航方式得到 其关联的持久化对象信息。 # OID检索方式 ~~~ Session.get(Customer.class,3); Session.load(Order.class,1); ~~~ Hibernate中通过get/load方法查询指定的对象,要通过OID来查询。 # 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()返回一个查询结果 ## 数据准备 ![](https://box.kancloud.cn/5c5b5deafcaea466041b1ce57337e1ed_674x545.png) ## 基本检索 form 类名 ![](https://box.kancloud.cn/d2b78e1014339d4f9ea4339d67bc52f0_776x426.png) ## 排序检索 ![](https://box.kancloud.cn/d3aec716af8197b23e65abcff29be50a_771x364.png) ## 条件检索 ![](https://box.kancloud.cn/f56579a339f5badb0ff1e1299c60e06f_788x524.png) ## 分页检索 ![](https://box.kancloud.cn/7dc55a8c9a9902633cb34844ab1a260b_687x487.png) ## 分组统计检索 分组 group by 统计 count max min avg sum ![](https://box.kancloud.cn/9ad6ad530613b04321cc9ee46d4a552e_760x509.png) ## 投影检索 使用投影将部分属性封装到对象中 ![](https://box.kancloud.cn/954cfa7aedbf10fe2655c731aceed094_780x511.png) 注意: 我们要在po类中提供对应属性的构造方法,也要有无参数构造 ## 命名检索 我们可以将hql语句先定义出来,在使用时通过session.getNamedQuery(hqlName);得到一个Query,在执行. 问题:hql定义在什么位置? 1.如果你有hbm配置文件,那么当前的hql操作是对哪一个实体进行操作,就在哪一个 实体的配置文件中声明。 ![](https://box.kancloud.cn/ff7c1e6029fd815ff233f33ef6ca6f83_687x263.png) # QBC QBC(query by criteria),它是一种更加面向对象的检索方式。 QBC步骤: 1. 通过Session得到一个Criteria对象 session.createCriteria() 2. 设定条件 Criterion实例 它的获取可以通过Restrictions类提供静态。 Criteria的add方法用于添加查询条件 3. 调用list进行查询 criterfia.list. ## 基本检索 ![](https://box.kancloud.cn/ed7f2c144ef957fe1d497bddd08e6d1b_759x436.png) ## 排序检索 ![](https://box.kancloud.cn/c42639254853d95257d9dedcd3118e46_763x397.png) 注意在criteri.addOrder()方法的参数使用的Order是hibernate中的对象 ## 条件检索 ![](https://box.kancloud.cn/de33c8581990d3b5d49e31d119e98bec_768x574.png) ## 分页检索 ![](https://box.kancloud.cn/dd27c0923234755ef5372d62368dbf65_768x429.png) ## 统计分组检索 Count sum avg max min ![](https://box.kancloud.cn/417f14e1c733848179a4098e53ee3d66_773x223.png) ## 离线条件检索 在多条件查询的时候,需要在Web层封装相应的参数到Criteria,而在Dao层才真正的去执行查询数据库的操作,所以需要在Web层创建Criteria并将其传递到Dao层,这个时候就不能在Web层使用session.createCriteria来创建Criteria,因为Criteria的一般创建都是使用session.createCriteria(),而session都是在Dao层才会创建的 ![](https://box.kancloud.cn/87bf07e275aef50738564423b4a2508d_756x420.png) # 本地SQL ![](https://box.kancloud.cn/9e74914690dac5d81f26adfca11dd450_794x620.png) ![](https://box.kancloud.cn/12ed466e7945eba6757889baddb66c1e_789x296.png) # 多表操作 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; # HQL多表操作 Hql多表操作分类: 1. 1. 交叉连接 2. 2. 内连接 * a) 显示内连接 * b) 隐式内连接 * c) 迫切内连接 * 3. 外连接 左外连接 迫切左外连接 右外连接 注意:在hibernate中有迫切连接的概念,而sql中没有。 ## 内连接 显示内连接 显示内连接使用的是inner join with ![](https://box.kancloud.cn/5b8fa062a3f8abd436045967475a2e49_771x503.png) ## 隐式内连接 隐式内连接也我们在sql中操作不一样,它是通过”.”运算符来关联 ![](https://box.kancloud.cn/fbd44206b33d2aa1caaefa3c94b5619e_737x357.png) ## 迫切内连接 迫切内连接得到的结果是直接封装到PO类中,而内连接得到的是Object[]数组,数组中封装的是PO类对象。 ![](https://box.kancloud.cn/f432cc64ced26d6e2491a929171f71a0_792x457.png) ## 外连接 ![](https://box.kancloud.cn/4450e4c8deb8e84059bad8a628242251_782x528.png)