Hibernate批量处理数据、HQL连接查询
一、批量处理操作
批量处理数据是指在一个事务场景中处理大量数据。在应用程序中难以避免进行批量操作,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连接查询相关推荐
- hql连接查询及外置命名查询
一.连接查询 在sql中经常使用连接查询来获取多个对象的合集,其中经常用到的有inner join.left join.right join等,分别指代内连接查询.左外连接查询.右外连接查询,它们在查 ...
- MySQL数据库内连接查询inner join...on
1. 连接查询介绍 连接查询可以实现多个表的查询,当查询的字段数据来自不同的表就可以使用连接查询来完成. 连接查询可以分为: 内连接查询 左连接查询 右连接查询 自连接查询 2. 内连接查询 查询两个 ...
- 高级数据操作--连接查询
一.连接查询--交叉连接 概念 表与表之间是有联系的! 所谓的连接查询,就是指将两张表或者多张表按照某个指定的条件,进行横向上的连接并显示! 所以,从结果上看,字段数增加了! 分类 根据连接查询的性质 ...
- MySQL管理和查询数据:连接查询案例
1 使用内连接获取所有的线路信息和车辆信息 车辆表 vehicle 与线路表 line 存在一个连接依据列--lineID. 连接以上两张表,使用内连接并采用"*"作为字段列表 2 ...
- DQL数据查询语言——连接查询
--内连接 两种写法 等值连接 select r.*,b.bummc from t_hq_ryxx r, t_hq_bm b where r.bumbm = b.bumbm select r.*,b. ...
- Sql语句中两个比较迷糊的概念:“连接查询” 与 “外键约束”
Sql语句中两个比较迷糊的概念:"连接查询" 与 "外键约束 Sql 中的连接查询:就是为了避免笛卡尔积,因为涉及到多表查询的化,不使用连接查询,会先将多个互相乘,求出笛 ...
- MySQL连接查询,子查询,union(合并),分页
连接查询涉及到主键,外键知识,后面讲 建立两种简单的表作为例子: mysql> select * from student; +----+------+-------+ | id | name ...
- mysql 连接查询索引_Mysql (四)连接查询和索引
一.什么是连接查询:就是将二个或二个以上的表,"连接起来"当做一个数据源,并从中去取得所须要的数据.连接查询包括交叉连接查询.内连接查询.外连接查询 (一)交叉连接:交叉连接不带W ...
- hibernate批量删除和更新数据
转载自:http://blog.csdn.net/yuhua3272004/article/details/2909538 Hibernate3.0 採用新的基于ANTLR的HQL/SQL查询翻译器, ...
- hibernate批量查询_使用Hibernate批量获取
hibernate批量查询 如果需要从Java处理大型数据库结果集,则可以选择JDBC,以提供所需的低级控制. 另一方面,如果您已在应用程序中使用ORM,则回退到JDBC可能会带来一些额外的麻烦. 在 ...
最新文章
- 有人能用外行人解释什么是JSONP吗? [重复]
- python之socketserver实现并发
- 观察者模式——解耦利器
- 在mac上安装Docker
- day2 程序流程控制
- 技术人生:给自己安慰的10句温馨话
- java单例模式7种_Java 单例模式的7种写法
- WPF RichTextBox自动调整高度
- html辅助方法以及常用属性值,ASP.NET MVC 2博客系列之一:强类型HTML辅助方法
- [数据结构]前缀、中缀、前缀表达式
- 在线API 工具之SosoApi
- 并网逆变器PI控制(并网模式)
- 输入法变成繁体后改回简体中文
- 多模态机器翻译 | (1) 简介
- 浙大python网_Python爬虫学习(7):浙大软院网号嗅探
- xcode快捷方式 一 快速找到对应文件
- 第一篇,从0开始安装Ubuntu
- python动作识别代码_基于openpose的动作识别(二)
- 拼多多拼团电子商务论文题目(精选)
- 磁带机PowerVault LTO-7使用