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());
            }
        }

输出结果:

时间: 2024-11-03 21:36:17

Hibernate批量处理数据、HQL连接查询的相关文章

关于hibernate 多实体(多表)连接查询映射到实体的讨论

前提表与实体信息: 在hibernate 查询中,我们经过遇到三种情况: 1.查询事个实体,如: select  b from TableB b; 返回的LIst 中封装的是 实体TableB的实例. 2.查询单个属性,如: select b.id from TableB b; hibernate 返回的List 中封装的是ojbect对象. 3.当查询多于一个属性且又不是整个实体时,如:select b.id,b.mes from TableB b;返回的List中封装的是Object[]数组

hibernate 批量处理数据

批量处理数据是指在一个事务中处理大量数据. 在应用层进行批量操作, 主要有下面方式: 通过 Session 通过 HQL 通过 StatelessSession 通过 JDBC API(仅仅要会用这样的,其它作为了解) 通过 Session 来进行批量操作 Session 的 save() 及 update() 方法都会把处理的对象存放在自己的缓存中. 假设通过一个 Session 对象来处理大量持久化对象, 应该及时从缓存中清空已经处理完成而且不会再訪问的对象. 详细的做法是在处理完一个对象或

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

一.连接查询——交叉连接 概念 表与表之间是有联系的! 所谓的连接查询,就是指将两张表或者多张表按照某个指定的条件,进行横向上的连接并显示! 所以,从结果上看,字段数增加了! 分类 根据连接查询的性质不同,又可以分成交叉连接.内连接.外连接和自然连接! 交叉连接关键字:cross join  交叉连接含义: 交叉连接是最容易理解的,就是指从一张表中的每一条记录分别去连接另外一张表的所有的记录,并且保存所有的记录,其中也包括两张表的所有的字段! 所以说,交叉连接的本质就是两张数据表做笛卡尔积! 笛

数据(连接查询、纵向联合、索引/键、CHECK约束)

-----连接查询----- ---纵向联合--- 索引/键 添加-列-确定 CHECK约束:规定他范围,不能超过范围 stable表-设计-cid右键-CHECK约束-添加-表达式后面的省略号 - 设置为年龄大于0,小于150,超过设置范围语句与约束冲突终止

hibernate hql 连接查询

  hql语句多表查询 不能用 ON   可以是: inner join(内连接) left outer join(左外连接) right outer join(右外连接) full join (全连接,并不常用) 例子: from UserActivitiesRelation uar left join uar.activities as a  left join uar.user as u where 1=1

【Hibernate步步为营】--hql连接查询及外置命名查询

http://www.zhuke.com/user/zkuser55857163/overview?SEOwhy=www.baidu.comhttp://www.zhuke.com/user/zkuser35087475/overview?SEOwhy=www.baidu.comhttp://www.zhuke.com/user/zkuser23388715/overview?SEOwhy=www.baidu.comhttp://www.zhuke.com/user/zkuser86852476

hibernate批量处理数据

(1)使用HQL进行批量操作  数据库层面  executeUpdate() @Testpublic void test2() { Query query = session.createQuery("insert into Stu(sname) select s.sname from Stu s"); query.executeUpdate();} @Testpublic void test3() { Query query = session.createQuery("u

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

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

Hibernate 批量update数据时,怎么样做可以回滚,

1.serviceManagerDaoImpl代码里对异常不进行try,catch抛出, 2.或者抛出throw new RuntimeException()异常