Hibernate批量处理数据、HQL连接查询
一、批量处理操作
批量处理数据是指在一个事务场景中处理大量数据。在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据:
(1)使用HQL进行批量操作 数据库层面
(2)使用JDBC API进行批量操作 数据库层面
(3)使用Session进行批量操作 会进缓存
1.使用HQL进行批量操作
HQL可以查询数据,也可以批量插入、更新和删除数据。HQL批量操作实际上直接在数据库中完成,处理的数据不需要加载到Session缓存中。使用Query接口的executeUpdate()方法执行用于插入、更新和删除的HQL语句。
以Emp和Dept为例:
例:批量添加3个部门

@Test
public 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语句

@Test
public 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个员工
*/ @Test
public 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后面紧接的是部门 则输出的先是部门的内存地址

/*
* 内连接 员工隶属的部门
*/ @Test
public 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属性。使用隐式内连接按部门查询员工信息。
例:按部门条件查询员工信息

/*
* 隐式内连接 按部门条件查询员工信息
*/ @Test
public 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

/*
* 迫切内连接 查询所有的雇员名称和隶属部门名称
*/ @Test
public 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());
}
}

输出结果:
Hibernate批量处理数据、HQL连接查询的更多相关文章
- Hibernate批量处理数据、[HQL连接查询]
一.批量处理操作 批量处理数据是指在一个事务场景中处理大量数据.在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作 数据库层面 (2)使 ...
- 【学习笔记】Hibernate HQL连接查询和数据批处理 (Y2-1-7)
HQL连接查询 和SQL查询一样 hql也支持各种链接查询 如内连接 外连接 具体如下 左外连接 left (outer) join 迫切左外连接 left (outer) join fetch 右外 ...
- HQL连接查询和注解
HQL连接查询和注解 一:HQL连接查询 各种连接查询: 内连接:inner join或join From Entity inner [inner] join [fetch] Entity.prope ...
- Hibernate 批量update数据时,怎么样做可以回滚,
Hibernate 批量update数据时,怎么样做可以回滚, 1.serviceManagerDaoImpl代码里对异常不进行try,catch抛出, 2.或者抛出throw new Runtime ...
- HQL连接查询
HQL提供了连接查询机制如内连接,外连接,,还允许显示指定迫切内连接,和迫切外联结. 连接类型 内连接 inner join 或join 迫切内链接 inner join fetch 左外联结 le ...
- Hibernate批量处理数据
01.批量插入数据 步骤一.创建实体类,Dept和Emp /** * 员工类 * @author Administrator * */ public class Emp { private Integ ...
- hibernate 批量处理数据
批量处理数据是指处理大量数据的一个单独的事务. 在应用层批处理操作, 主要有以下方式: 通过 Session 通过 HQL 通过 StatelessSession 通过 JDBC API(仅仅要会用这 ...
- hibernate 批量插入数据
如题,有两种方法 1)使用FLUSH 2)使用JDBC 分别来解释: 1)hibernate在进行数据库操作的时候,都要有事务支持的.可能你曾遇到过,没有加事务,程序会报错的情况. 而事务每次提交的时 ...
- DQL数据查询语言——连接查询
--内连接 两种写法 等值连接select r.*,b.bummc from t_hq_ryxx r, t_hq_bm b where r.bumbm = b.bumbm select r.*,b.b ...
随机推荐
- [ javascript canvas 插件演示 ] canvas 插件演示
<!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...
- [Dynamics CRM 2016]如何配置多语言显示
1.安装相对应的语言包并安装 2015语言包下载地址:https://www.microsoft.com/en-us/download/details.aspx?id=45014 2016语言包下载地 ...
- OC中UITabBarController控制器
UITabBarController UITabBarController(记为O)常用于管理多个导航控制器,例如有ABC三个导航控制器,可以:addChildViewController(记为A), ...
- nodejs events模块
var EventEmitter = require('events').EventEmitter; var emitter = new EventEmitter(); console.log(emi ...
- “vmware tools 只能虚拟机中安装”的解决方法
vmware安装的一个大坑,最近在开发上需要用到centos 6.4,由于我本身的系统是win8所以决定使用虚拟机,选择了vmware,并且从网上下载的虚拟机的映像文件.中间安装了vmware8,安装 ...
- SQL server 2014安装以及解决连接数据库失败问题
安装教程:http://jingyan.baidu.com/article/3a2f7c2e653d5926afd61197.html 安装好之后打开SQL server 2014 Managemen ...
- 什么是ODBO---OLE DB for OLAP
我怎么一步一步追到ODBO了? mondrian核心api->olap4j->jedox也在用olap4j->ODBO? ODBO是什么呢? OLE DB for OLAP ...
- SSH框架搭建详解 及 乱码处理
http://www.360doc.com/content/15/1031/21/21693298_509739569.shtml struts 除了struts的mvc外,还有拦截器,国际化,str ...
- android项目中配置NDK自动编译生成so文件
1 下载ndk开发包 2 在android 项目中配置编译器(以HelloJni项目为例) 2.1 创建builer (a)Project->Properties->Builder ...
- Solr页面查询各个字段参数解释
q:查询的关键字,此参数最为重要,例如,q=id:1,默认为q=*:*,类似于sql中的where 1=1. fq(filter query):过滤查询,提供一个可选的筛选器查询.返回在q查询符合结果 ...