一.Hibernate检索方式概述

  1. OID检索方式:按照对象的OID来检索对象(get/load)
  2. HQL检索方式:使用面向对象的HQL查询语言
  3. QBC检索方式:使用QBC(Query By Criteria)API来检索对象,这种api封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口(功能较弱)
  4. 本地SQL检索方式:使用本地数据库的SQL查询语句。

二.Hibernate检索策略

Hibernate提供了多种查询检索方式,每种方式查询数据的方式与时间段都不同,

Hibernate提供了延迟加载(load)、立即加载(get)两种检索策略。

延迟加载(懒加载):延迟加载检索方法指定的对象,也就是查询的时候并不是马上去查询并加载持久化对象,而是在调用持久化对象的方法时再去加载。

立即加载:立即加载检索方法指定的对象。

->使用load方法获取对象,默认是延迟加载的,通过观察sql语句执行的位置可以看出,检索持久化对象时并不查询数据库,而当调用持久化对象的方法时才去查询数据库,这种策略就叫延迟加载。使用get方法获取持久化对象,会马上执行sql语句,这种策略叫立即加载。

  1. public class Demo {
  2. @Test
  3. public void test(){
  4. Configuration cfg = new Configuration().configure();
  5. SessionFactory sf = cfg.buildSessionFactory();
  6. Session session = sf.openSession();
  7. Transaction ts = session.beginTransaction();
  8. Dept dept = (Dept)session.load(Dept.class, 1);
  9. System.out.println("此时不查询数据库");
  10. System.out.println(dept.getDname());
  11. ts.commit();
  12. session.close();
  13. sf.close();
  14. }
  15. }

使用load方法时,返回的是一个代理对象,该代理对象的特点:

1 .是持久化类的子类对象。

2 .包含持久化类的全部属性以及属性的get/set函数。

3. 对get函数进行了覆盖:原理如下

public String getName() {

this.name = queryFromDb();//数据库查询

return this.name;

}

4.Hibernate使用javassist-3.9.0.GA.jar包创建代理

类级别检索策略: session的方法直接检索持久化对象,hibernate加载该持久化对象的策略。

关联级别检索策略:查询持久化对象的关联对象的加载策略。

三.关联级别检索策略(一对多,多对多检索策略)

lazy属性:是否延迟加载,

true :延迟加载  (默认):查询持久化对象,使用相关联对象时再去查询

false:即时加载  :查询持久化对象时会查询出所有与持久化对象相关联的对象

一般情况下都要设置Lazy=true, 这样可以少查无用的数据, 提高性能. 但是有的时候需要一次性把关联的数据都查出来, 这个时候就需要使用积极加载去避免lazy loading了. 具体情况具体分析。

* 类级别的检索:<class>标签上配置lazy

* 关联级别的检索: <set>/<many-to-one>上面的lazy。

注意:无论 <class> 元素的 lazy 属性是 true 还是 false, Session get() 方法在类级别总是使用立即检索策略

比较检索策略

四.HQL检索方式

1>HQL(Hibernate Query Language) 是面向对象的查询语言,确切的说他是以脚本的方式查询对象的语言。 它和SQL查询语言有些相似. 在Hibernate提供的各种检索方式中, HQ是使用最广的一种检索方式. 它有如下功能:

2>在查询语句中设定各种查询条件

支持投影查询,即仅检索出对象的部分属性;

支持分页查询;

支持连接查询;

支持分组查询,允许使用having和group by关键字

提供内置聚集函数,如sum(),min(),max();

能够调用用户定义的SQL函数或标准的SQL函数;

支持子查询;

支持动态绑定参数;

  1. /**
  2. * Created by jiatp
  3. */
  4. public class HqlTest {
  5. //1.基本查询
  6. @Test
  7. public void test1(){
  8. Session session = HibernateUtils.openSession();
  9. Transaction ts = session.beginTransaction();
  10. //查询所有部门信息
  11. String hql = "from Dept";
  12. Query query = session.createQuery(hql);
  13. List<Dept> list = query.list();
  14. for(Dept dept:list) {
  15. System.out.println(dept.getDname());
  16. System.out.println(dept.getEmps().size());
  17. }
  18. ts.commit();
  19. session.close();
  20. }
  21. //2.条件查询 1.占位符 2.参数命名
  22. @Test
  23. public void test2(){
  24. Session session = HibernateUtils.openSession();
  25. Transaction ts = session.beginTransaction();
  26. //查询所有部门信息
  27. String hql1 = "from Dept where did=?";
  28. String hql2 = "from Dept where did=:did";
  29. Query query1 = session.createQuery(hql1);
  30. Query query2 = session.createQuery(hql2);
  31. //占位符赋值
  32. query1.setInteger(0,1);
  33. //参数命名赋值
  34. query2.setInteger("did",1);
  35. //查询
  36. Dept dept1 = (Dept)query1.uniqueResult();
  37. Dept dept2 = (Dept)query2.uniqueResult();
  38. System.out.println(dept1.getDname());
  39. System.out.println(dept2.getDname());
  40. ts.commit();
  41. session.close();
  42. }
  43. //3.分页查询
  44. @Test
  45. public void test3(){
  46. Session session = HibernateUtils.openSession();
  47. Transaction ts = session.beginTransaction();
  48. //查询所有部门信息
  49. String hql = "from Dept where dname like ?";
  50. Query query = session.createQuery(hql);
  51. query.setParameter(0,"%发%"); //变量用+连接"+"+ 变量+"%"
  52. //分页
  53. query.setFirstResult(0);
  54. query.setMaxResults(3);
  55. List<Dept> list = query.list();
  56. for(Dept dept: list) {
  57. System.out.println(dept.getDid()+"==="+dept.getDname());
  58. }
  59. ts.commit();
  60. session.close();
  61. }
  62. //4.投影查询 返回一个数组
  63. @Test
  64. public void test5(){
  65. Session session = HibernateUtils.openSession();
  66. Transaction ts = session.beginTransaction();
  67. //查询所有部门信息
  68. String hql1 = "select did,dname from Dept";//返回对象数组
  69. Query query = session.createQuery(hql1);
  70. List<Object[]> list = query.list();
  71. for(int i=0;i<list.size();i++) {
  72. Object[] object = list.get(i);
  73. System.out.println(object[0]+"===="+object[1]);
  74. }
  75. String hql2 = "select dt from Dept dt"; //返回集合对象
  76. Query query1 = session.createQuery(hql2);
  77. List<Dept> list1 = query1.list();
  78. for(Dept dept:list1) {
  79. System.out.println(dept.getDid()+"=="+dept.getDname());
  80. }
  81. //Dept类中要提供构造方法
  82. String hql3 = "select new Dept(did,dname) from Dept";
  83. Query query2 = session.createQuery(hql3);
  84. List<Dept> list2 = query2.list();
  85. for(Dept dept:list2) {
  86. System.out.println(dept.getDid()+"=="+dept.getDname());
  87. }
  88. ts.commit();
  89. session.close();
  90. }
  91. // 5.排序
  92. @Test
  93. public void test6(){
  94. Session session = HibernateUtils.openSession();
  95. Transaction ts = session.beginTransaction();
  96. String hql = "select dt from Dept d t order by dt.did desc";
  97. Query query = session.createQuery(hql);
  98. List<Dept> list = query.list();
  99. for(Dept dept:list) {
  100. System.out.println(dept.getDid()+"=="+dept.getDname());
  101. }
  102. ts.commit();
  103. session.close();
  104. }
  105. //6.查询聚合函数
  106. @Test
  107. public void test7(){
  108. Session session = HibernateUtils.openSession();
  109. Transaction ts = session.beginTransaction();
  110. String hql1 = "select COUNT (*) FROM Dept";
  111. String hql2 = "select sum (did) FROM Dept";
  112. String hql3 = "select avg (did) FROM Dept";
  113. String hql4 = "select max (did) FROM Dept";
  114. String hql5 = "select min (dit) FROM Dept";
  115. Query query = session.createQuery(hql1);
  116. Number i =(Number) query.uniqueResult();
  117. System.out.println(i);
  118. ts.commit();
  119. session.close();
  120. }
  121. //7.增加一个部门 广告部
  122. @Test
  123. public void test8(){
  124. Session session = HibernateUtils.openSession();
  125. Transaction ts = session.beginTransaction();
  126. Dept dept = new Dept();
  127. dept.setDname("广告部");
  128. session.save(dept);
  129. ts.commit();
  130. session.close();
  131. }
  132. //8.删除
  133. @Test
  134. public void test9(){
  135. Session session = HibernateUtils.openSession();
  136. Transaction ts = session.beginTransaction();
  137. String hql = "delete from Dept dt where dt.did=? ";
  138. Query query = session.createQuery(hql);
  139. query.setParameter(0,7);
  140. query.executeUpdate();
  141. ts.commit();
  142. session.close();
  143. }
  144. //外联(左外联,右外联)/迫切
  145. //内联,
  146. @Test
  147. public void test8() {
  148. Session session = HibernateUtils.openSession();
  149. Transaction tx = session.beginTransaction();
  150. //************************************
  151. String hql="from Dept d inner join d.emps";
  152. Query query = session.createQuery(hql);
  153. List list = query.list();
  154. for(int i=0;i<list.size();i++){
  155. Object[] obj = (Object[]) list.get(i);
  156. System.out.println(((Dept)obj[0]).getDname()+"===="+((Emp)obj[1]).getEname());
  157. }
  158. //************************************
  159. tx.commit();
  160. session.close();
  161. }
  162. //内联,/迫切
  163. @Test
  164. public void test9() {
  165. Session session = HibernateUtils.openSession();
  166. Transaction tx = session.beginTransaction();
  167. //*****************************************
  168. String hql="from Dept d inner join fetch d.emps";
  169. Query query = session.createQuery(hql);
  170. List<Dept> list = query.list();
  171. //创建集合保存部门名称
  172. List<String> lstr = new ArrayList<String>();
  173. for (Dept dept : list) {
  174. Set<Emp> emps = dept.getEmps();
  175. Iterator<Emp> it = emps.iterator();
  176. while(it.hasNext()){
  177. Emp emp = it.next();
  178. if(lstr.contains(emp.getDept().getDname())){
  179. continue;
  180. }else{
  181. System.out.println(dept.getDname()+"==="+emp.getEname());
  182. }
  183. }
  184. //处理重复部门名
  185. lstr.add(dept.getDname());
  186. }
  187. //****************************************
  188. tx.commit();
  189. session.close();
  190. }
  191. //左外联
  192. @Test
  193. public void test10() {
  194. Session session = HibernateUtils.openSession();
  195. Transaction tx = session.beginTransaction();
  196. //************************************
  197. String hql="from Dept d left join d.emps";
  198. Query query = session.createQuery(hql);
  199. List list = query.list();
  200. for(int i=0;i<list.size();i++){
  201. Object[] obj = (Object[]) list.get(i);
  202. if(obj!=null){
  203. System.out.print(((Dept)obj[0]).getDname());
  204. if(((Emp)obj[1])!=null){
  205. System.out.print("\t"+((Emp)obj[1]).getEname());
  206. }
  207. System.out.println();
  208. }
  209. }
  210. //************************************
  211. tx.commit();
  212. session.close();
  213. }
  214. //右外联,
  215. @Test
  216. public void test11() {
  217. Session session = HibernateUtils.openSession();
  218. Transaction tx = session.beginTransaction();
  219. //************************************
  220. String hql="from Dept d right join d.emps";
  221. Query query = session.createQuery(hql);
  222. List list = query.list();
  223. for(int i=0;i<list.size();i++){
  224. Object[] obj = (Object[]) list.get(i);
  225. if(obj!=null){
  226. if(((Dept)obj[0])!=null){
  227. System.out.print(((Dept)obj[0]).getDname());
  228. }
  229. if(((Emp)obj[1])!=null){
  230. System.out.print("\t"+((Emp)obj[1]).getEname());
  231. }
  232. System.out.println();
  233. }
  234. }
  235. //************************************
  236. tx.commit();
  237. session.close();
  238. }
  239. //左外联,/迫切
  240. @Test
  241. public void test12() {
  242. Session session = HibernateUtils.openSession();
  243. Transaction tx = session.beginTransaction();
  244. //************************************
  245. String hql="from Dept d left join fetch d.emps";
  246. Query query = session.createQuery(hql);
  247. List<Dept> list = query.list();
  248. for(Dept dept : list){
  249. Set<Emp> emps = dept.getEmps();
  250. Iterator<Emp> it = emps.iterator();
  251. //
  252. if(dept.getDname()!=null){
  253. System.out.print(dept.getDname());
  254. }
  255. while(it.hasNext()){
  256. Emp emp = it.next();
  257. if(emp.getDept().getDname()!=dept.getDname()){
  258. System.out.print(dept.getDname());
  259. }
  260. if(emp.getEname()!=null){
  261. System.out.print("\t"+emp.getEname());
  262. }
  263. System.out.println();
  264. }
  265. }
  266. //************************************
  267. tx.commit();
  268. session.close();
  269. }
  270. //分组
  271. @Test
  272. public void test13(){
  273. Session session = HibernateUtils.openSession();
  274. Transaction tx = session.beginTransaction();
  275. //************************************
  276. //查询部门中的员工的人数
  277. String hql ="select count(*),e.dept.dname from Emp e group by e.dept.dname";
  278. Query query = session.createQuery(hql);
  279. List<Object[]> list = query.list();
  280. for(int i = 0 ;i<list.size();i++){
  281. Object[] o = list.get(i);
  282. System.out.println(o[0]+"====="+o[1]);
  283. }
  284. //************************************
  285. tx.commit();
  286. session.close();
  287. }
  288. }

五.QBC检索方式

QBC查询就是通过使用Hibernate提供的Query By Criteria API来查询对象,这种API封装了SQL语句的动态拼装,对查询提供了更加面向对象的功能接口。

  1. public class TestQbc {
  2. //简单的查询 (无sql)
  3. @Test
  4. public void test() {
  5. Session session = HibernateUtils.openSession();
  6. Transaction tx = session.beginTransaction();
  7. //************************************
  8. //查询所有部门信息
  9. Criteria criteria = session.createCriteria(Dept.class);
  10. List<Dept> list = criteria.list();
  11. System.out.println(list);
  12. //************************************
  13. tx.commit();
  14. session.close();
  15. }
  16. //按条件查询
  17. //== eq
  18. //>= ge
  19. //> gt
  20. //<= le
  21. //< lt
  22. //<> != ne
  23. //in in
  24. //between between
  25. //like like
  26. //is null isNull
  27. //is not null isNotNull
  28. //and and
  29. //or or
  30. @Test
  31. public void test1() {
  32. Session session = HibernateUtils.openSession();
  33. Transaction tx = session.beginTransaction();
  34. //************************************
  35. //查询did=2 部门名称
  36. Criteria criteria = session.createCriteria(Dept.class);
  37. criteria.add(Restrictions.eq("did", 2));
  38. Dept dept = (Dept) criteria.uniqueResult();
  39. System.out.println(dept.getDname());
  40. //************************************
  41. tx.commit();
  42. session.close();
  43. }
  44. //分页
  45. @Test
  46. public void test2() {
  47. Session session = HibernateUtils.openSession();
  48. Transaction tx = session.beginTransaction();
  49. //************************************
  50. //limit 0,3
  51. Criteria criteria = session.createCriteria(Dept.class);//.setFirstResult(0).setMaxResults(3).list();
  52. criteria.setFirstResult(0); //起始值
  53. criteria.setMaxResults(3); //条数
  54. List<Dept> list = criteria.list();
  55. System.out.println(list);
  56. //************************************
  57. tx.commit();
  58. session.close();
  59. }
  60. //查询总记录数
  61. @Test
  62. public void test3() {
  63. Session session = HibernateUtils.openSession();
  64. Transaction tx = session.beginTransaction();
  65. //************************************
  66. //limit 0,3
  67. Criteria criteria = session.createCriteria(Dept.class);
  68. criteria.setProjection(Projections.rowCount());
  69. Long iter = (Long) criteria.uniqueResult();
  70. System.out.println(iter);
  71. //************************************
  72. tx.commit();
  73. session.close();
  74. }
  75. }

Criteria:限制符

六.本地SQL检索方式

  1. public class TestSql {
  2. //简单部门信息
  3. @Test
  4. public void test1() {
  5. Session session = HibernateUtils.openSession();
  6. Transaction tx = session.beginTransaction();
  7. //************************************
  8. String sql="select dname,ename from Dept d,emp e where d.did=e.deptid";
  9. SQLQuery sqlquery = session.createSQLQuery(sql);
  10. List list = sqlquery.list();
  11. for(int i=0;i<list.size();i++){
  12. Object[] obj = (Object[]) list.get(i);
  13. System.out.println(obj[0]+"===="+obj[1]);
  14. }
  15. //************************************
  16. tx.commit();
  17. session.close();
  18. }
  19. //条件
  20. @Test
  21. public void test2() {
  22. Session session = HibernateUtils.openSession();
  23. Transaction tx = session.beginTransaction();
  24. //************************************
  25. String sql="select * from Dept where dname like ?";
  26. SQLQuery sqlquery = session.createSQLQuery(sql);
  27. sqlquery.setParameter(0, "%发%");
  28. //返回实体
  29. sqlquery.addEntity(Dept.class);
  30. List<Dept> list = sqlquery.list();
  31. for (Dept dept : list) {
  32. System.out.println(dept.getDname());
  33. }
  34. //************************************
  35. tx.commit();
  36. session.close();
  37. }
  38. //分页
  39. @Test
  40. public void test3() {
  41. Session session = HibernateUtils.openSession();
  42. Transaction tx = session.beginTransaction();
  43. //************************************
  44. String sql="select * from Dept limit ?,?"; //hql语句:count(*)
  45. SQLQuery sqlQuery = session.createSQLQuery(sql);
  46. sqlQuery.setParameter(0, 0);
  47. sqlQuery.setParameter(1, 2);
  48. sqlQuery.addEntity(Dept.class);
  49. List<Dept> list = sqlQuery.list();
  50. for(Dept dept : list){
  51. System.out.println(dept.getDname());
  52. }
  53. //************************************
  54. tx.commit();
  55. session.close();
  56. }
  57. }

HQL和QBC比较:

04_Hibernate检索方式的更多相关文章

  1. Hibernate —— HQL、QBC检索方式

    一.HQL 检索方式 以双向的一对多来测试 HQL 检索方式.以 Department 和 Employee 为例. 建表语句: CREATE TABLE department ( dept_id ) ...

  2. Hibernate的检索方式

    Hibernate的检索方式 检索方式(查询的方式) 导航对象图检索方式: 根据已经加载的对象导航到其他对象 Customer customer = (Customer)session.get(Cus ...

  3. 攻城狮在路上(壹) Hibernate(十四)--- Hibernate的检索方式(下)

    本节介绍HQL和QBC的高级用法:各种连接查询.投影查询.报表查询.动态查询.集合过滤和子查询等.另外将归纳优化查询程序代码,从而提高查询性能的各种技巧.一.连接查询: HQL与QBC支持的各种连接类 ...

  4. 攻城狮在路上(壹) Hibernate(十三)--- Hibernate的检索方式(上)

    Hibernate提供了以下几种检索对象的方式: A.导航对象图检索方式. B.OID检索方式.Session.get() load(); C.HQL检索方式.Query. D.QBC检索方式.Que ...

  5. hibernate检索方式(HQL 检索方式,QBC 检索方式,本地 SQL 检索方式)

    hibernate有五种检索方式,这儿用 单向的一对多的映射关系 例子,这儿有后三种的方式: 导航对象图检索方式: 根据已经加载的对象导航到其他对象 OID 检索方式: 按照对象的 OID 来检索对象 ...

  6. Hibernate 检索方式

    概述 •Hibernate 提供了以下几种检索对象的方式 –导航对象图检索方式:  根据已经加载的对象导航到其他对象 –OID 检索方式:  按照对象的 OID 来检索对象 –HQL 检索方式: 使用 ...

  7. Hibernate入门6.Hibernate检索方式

    Hibernate入门6.Hibernate检索方式 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv Hibernate的整体框架已经 ...

  8. [原创]java WEB学习笔记89:Hibernate学习之路-- -Hibernate检索方式(5种),HQL介绍,实现功能,实现步骤,

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. Hibernate的三种常用检索方式

    Hibernate 提供了以下几种检索对象的方式 ¨       导航对象图检索方式:  根据已经加载的对象导航到其他对象 ¨       OID 检索方式:  按照对象的 OID 来检索对象 ¨   ...

随机推荐

  1. vue项目使用history模式打包应该注意的地方

    1.在config/index.js中将assetsPublicPath原来的’/‘修改为‘./’. build: { env: require('./prod.env'), index: path. ...

  2. Mybatis使用Mapper方式CURD

    Mybatis 使用Dao代码方式进行增.删.改.查和分页查询. 1.Maven的pom.xml 2.配置文件 2.1.db.properties 2.2.mybatis.xml <?xml v ...

  3. java 与日期转换相关的方法(java.util.date类型和java.sql.date类型互相转换)、随机字符串生成方法、UUID生产随机字符串

    package com.oop.util; import java.text.*; import java.util.UUID; import org.junit.Test; /* * 与日期相关的工 ...

  4. vba增删改查数据库

    你在EXCEL中增加一个列名为ID,后在VBA中写以下代码,并引用Microsoft ActiveX Data Objects 2.8后执行Public Sub 写入SQL2008()Dim cnn ...

  5. 字典配合split分裂填充

    Sub 配送日报()lastrow = Sheets("运营日报").Range("a1048576").End(xlUp).Rowarr = Sheets(& ...

  6. Linux 常用命令:解压缩篇

    前言 Linux常用命令中,有很多用于对文件的压缩或解压,本文将介绍这些解压缩命令中不常见却非常实用的用法. tar tar是linux中最常用的解压缩命令.tar命令可用于处理后缀名为tar,tar ...

  7. flask 使用hashlib加密

    flask 使用hashlib加密 import hashlib #引入hashlib #使用方法: password = ' sha1 = hashlib.sha1() #使用sha1加密方法,你还 ...

  8. 用while实现登录操作(3次过后,输入yes,使counter置0,还可以玩)

    用while实现登录操作(输入yes,使counter置0,还可以玩)#_author:Administrator#date:2019/10/24user_name="star"p ...

  9. 基于vue的环信基本实时通信功能

    本篇文章借鉴了一些资料,然后在这个基础上,我将环信的实现全部都集成在一个组件里面进行实现: https://blog.csdn.net/github_35631540/article/details/ ...

  10. LUOGU P2290 [HNOI2004]树的计数(组合数,prufer序)

    传送门 解题思路 \(prufer\)序,就是所有的不同的无根树,都可以转化为唯一的序列.做法就是每次从度数为\(1\)的点中选出一个字典序最小的,把这个点删掉,并把这个点相连的节点加入序列,直到只剩 ...