一、批量处理操作

批量处理数据是指在一个事务场景中处理大量数据。在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据:

(1)使用HQL进行批量操作     数据库层面

(2)使用JDBC API进行批量操作  数据库层面

(3)使用Session进行批量操作   会进缓存

1.使用HQL进行批量操作

HQL可以查询数据,也可以批量插入、更新和删除数据。HQL批量操作实际上直接在数据库中完成,处理的数据不需要加载到Session缓存中。使用Query接口的executeUpdate()方法执行用于插入、更新和删除的HQL语句。

以Emp和Dept为例:

例:批量添加3个部门

        @Testpublic void addTest(){String hql="insert into Dept(deptName) select d.deptName||d.deptNo from Dept d where d.deptNo>0";Query query=session.createQuery(hql);int count=query.executeUpdate();System.out.println("add ok!!");}

输出结果:

2.使用JDBC  API进行批量操作

在Hibernate应用中使用JDBC API批量执行插入、修改和删除语句时,需要使用Session的doWork(Work work)方法执行Work对象指定的操作,即调用Work对象的execute()方法。Session把当前使用的数据库连接传给execute()方法,执行持久化操作。

例:实现批量修改部门名称

将部门编号大于3的修改为开发部

注意:该方式使用的连接依然是最初的连接对象,并且命令对象依然是根据连接创建的,注意这里是SQL语句,不是HQL语句

      @Testpublic void updateTest(){final String sql="update Dept set deptname=? where deptno>?";Work work=new Work(){public void execute(Connection con) throws SQLException{PreparedStatement ps = con.prepareStatement(sql);ps.setString(1,"开发部");ps.setInt(2, 3);int count=ps.executeUpdate();//System.out.println(count);}};session.doWork(work);System.out.println("update ok!!!");}

实现效果:

3、实现session进行批量操作

使用Session对象处理大量持久化对象,需及时从缓存中清空已经处理完毕并且不会再访问的对象。可以在处理完成一个对象或小批量对象后,调用flush()方法强制同步缓存和数据库,然后调用clear()方法清空缓存。

例:批量添加15个员工

     /** session 实现批量添加15个员工*/@Testpublic void addSessionTest(){for(int i=0;i<=15;i++){Emp emp=new Emp();emp.setEmpName("呵呵"+i);Dept dept=new Dept();dept.setDeptNo(1);emp.setDept(dept);session.save(emp);if(i%10==0){session.flush();session.clear();}}System.out.println("add ok!!");}

输出结果:


二、HQL连接查询

HQL提供的连接方式如下表所示:


内连接:

语法:

from Entity inner join Entity.property

例:使用内连接查询员工隶属的部门

list集合中的每个元素都是一个Object数组,from后面紧接的是部门 则输出的先是部门的内存地址

     /** 内连接  员工隶属的部门*/@Testpublic void innerTest(){Query query=session.createQuery("from Dept d inner join d.emps");List<Object[]> list = query.list();for (Object[] item : list) {//一个item就是一个数组System.out.println(((Dept)item[0]).getDeptName()+"\t"+((Emp)item[1]).getEmpName());}}

输出结果:

隐式内连接:

在HQL查询语句中,如果对Emp类赋别名为”e”,可以通过e.dept.deptName的形式访问dept对象的deptName属性。使用隐式内连接按部门查询员工信息。

例:按部门条件查询员工信息

      /** 隐式内连接 按部门条件查询员工信息*/@Testpublic void hideTest(){Query query=session.createQuery("from Emp e where e.dept.deptName='开发部'");List<Emp> list = query.list();for (Emp item : list) {//一个item就是一个数组System.out.println(item.getEmpName());}}

输出结果:

3、迫切内连接

例:查询所有的雇员名称和隶属部门名称  需使用关键字fetch

         /** 迫切内连接  查询所有的雇员名称和隶属部门名称 */@Testpublic void FetchTest(){Query query=session.createQuery("from Dept d inner join fetch d.emps");List<Dept> list=query.list();for (Dept item : list) {System.out.println(item.getDeptName()+"\t"+item.getEmps().iterator().next().getEmpName());}}

输出结果:

转载于:https://www.cnblogs.com/hr1997/p/5855181.html

Hibernate批量处理数据、HQL连接查询相关推荐

  1. hql连接查询及外置命名查询

    一.连接查询 在sql中经常使用连接查询来获取多个对象的合集,其中经常用到的有inner join.left join.right join等,分别指代内连接查询.左外连接查询.右外连接查询,它们在查 ...

  2. MySQL数据库内连接查询inner join...on

    1. 连接查询介绍 连接查询可以实现多个表的查询,当查询的字段数据来自不同的表就可以使用连接查询来完成. 连接查询可以分为: 内连接查询 左连接查询 右连接查询 自连接查询 2. 内连接查询 查询两个 ...

  3. 高级数据操作--连接查询

    一.连接查询--交叉连接 概念 表与表之间是有联系的! 所谓的连接查询,就是指将两张表或者多张表按照某个指定的条件,进行横向上的连接并显示! 所以,从结果上看,字段数增加了! 分类 根据连接查询的性质 ...

  4. MySQL管理和查询数据:连接查询案例

    1 使用内连接获取所有的线路信息和车辆信息 车辆表 vehicle 与线路表 line 存在一个连接依据列--lineID. 连接以上两张表,使用内连接并采用"*"作为字段列表 2 ...

  5. DQL数据查询语言——连接查询

    --内连接 两种写法 等值连接 select r.*,b.bummc from t_hq_ryxx r, t_hq_bm b where r.bumbm = b.bumbm select r.*,b. ...

  6. Sql语句中两个比较迷糊的概念:“连接查询” 与 “外键约束”

    Sql语句中两个比较迷糊的概念:"连接查询" 与 "外键约束 Sql 中的连接查询:就是为了避免笛卡尔积,因为涉及到多表查询的化,不使用连接查询,会先将多个互相乘,求出笛 ...

  7. MySQL连接查询,子查询,union(合并),分页

    连接查询涉及到主键,外键知识,后面讲 建立两种简单的表作为例子:  mysql> select * from student; +----+------+-------+ | id | name ...

  8. mysql 连接查询索引_Mysql (四)连接查询和索引

    一.什么是连接查询:就是将二个或二个以上的表,"连接起来"当做一个数据源,并从中去取得所须要的数据.连接查询包括交叉连接查询.内连接查询.外连接查询 (一)交叉连接:交叉连接不带W ...

  9. hibernate批量删除和更新数据

    转载自:http://blog.csdn.net/yuhua3272004/article/details/2909538 Hibernate3.0 採用新的基于ANTLR的HQL/SQL查询翻译器, ...

  10. hibernate批量查询_使用Hibernate批量获取

    hibernate批量查询 如果需要从Java处理大型数据库结果集,则可以选择JDBC,以提供所需的低级控制. 另一方面,如果您已在应用程序中使用ORM,则回退到JDBC可能会带来一些额外的麻烦. 在 ...

最新文章

  1. 有人能用外行人解释什么是JSONP吗? [重复]
  2. python之socketserver实现并发
  3. 观察者模式——解耦利器
  4. 在mac上安装Docker
  5. day2 程序流程控制
  6. 技术人生:给自己安慰的10句温馨话
  7. java单例模式7种_Java 单例模式的7种写法
  8. WPF RichTextBox自动调整高度
  9. html辅助方法以及常用属性值,ASP.NET MVC 2博客系列之一:强类型HTML辅助方法
  10. [数据结构]前缀、中缀、前缀表达式
  11. 在线API 工具之SosoApi
  12. 并网逆变器PI控制(并网模式)
  13. 输入法变成繁体后改回简体中文
  14. 多模态机器翻译 | (1) 简介
  15. 浙大python网_Python爬虫学习(7):浙大软院网号嗅探
  16. xcode快捷方式 一 快速找到对应文件
  17. 第一篇,从0开始安装Ubuntu
  18. python动作识别代码_基于openpose的动作识别(二)
  19. 拼多多拼团电子商务论文题目(精选)
  20. 磁带机PowerVault LTO-7使用

热门文章

  1. SOS Dynamic Programming
  2. Intel BIGDL 探索
  3. 周界防护在安防行业重要性与日俱增
  4. jQuery基础知识--Form基础(续)
  5. 生活娱乐 长的最奇怪的东西——骡耳犰狳
  6. PHP关于按位取反结果的推导过程
  7. 慢系统调用 与 信号
  8. linux上jdk安装
  9. shell字符串的截取的问题
  10. 一个老板向员工发的牢骚