HQL提供了连接查询机制如内连接,外连接,,还允许显示指定迫切内连接,和迫切外联结。

连接类型

内连接 inner join 或join

迫切内链接 inner join fetch

左外联结  left outer join 或 join

迫切左外连接 left outer join fetch 或 left join fetch

右外连接 right outer join 或 right join

1.内连接

@Test
    //02.隐式内连接
    public void testHideInnerJoin(){
        Query query = session.createQuery("from Emp e where e.dept.deptName='开发部'");
        List<Emp> list = query.list();
        for (Emp emp : list) {
            System.out.println(emp.getEmpName());
        }
    }

2.迫切内连接

@Test
    public void innerJoinTest(){
        Query query = session.createQuery("select distinct d from Dept d inner join  d.emps");
        List<Dept> list = query.list();
        for (Dept dept : list) {
     System.out.println(dept.getDeptName());
            for (Emp emp : dept.getEmps()) {
                System.out.println(emp.getEmpName());
            }
        }
    }

3.左外连接

from Entity left join [fetch] Entity.propert

右外连接

from Entity right join Entity.property

注意:fetch关键字只对inner join 和 left join 有效。对于righ join 而言,由于作为关联对象

容器的“左边”对象可能为null,所以也就是无法通过fatch关键字强制Hibernate进行填充操作。

二,查询性能优化

1.Hibernate主要从以下方面查询性能。

使用迫切左外连接或迫切内连接查询缓存方式,减少select语句的数目,降低访问数据库的频率。

2.使用延迟加载策略方式避免加载多余的不需要访问的数据。

3.使用Query接口的iterator()方法减少select语句中的字段,从而降低访问数据库的数据量。

解析:第一次使用list()方法查询时,Hibernate从数据库查询Emp,对象,把所有的Emp对象放入Session缓存中,第二次使用list()查询shi2,Hibernate仍然从数据库查询Emp对象,而不是从Session缓存中获取Emp对象。

HQL优化:

HQL优化是Hibernate程序性能优化的一个方面,HQL的语法与SQL非常相似。HQL是基于SQL的,只是增加了面向对象的封装。如果抛开HQL同Hibernate本身一些缓存机制的关联,HQL的优化技巧同SQL的优化技巧一样。在编写HQL时,需注意以下几个原则:

(1)避免or操作的使用不当

(2)避免使用not

(3)避免使用like的特殊形式,例如 “%”或者”_”开头

(4)避免having字句

(5)避免distinct

(6)索引在以下情况下失效,应注意使用

1.只要对字段使用函数,该字段的索引将不起作用,如substring(aa,1,2)=’xx’

2.只要对字段进行计算,该字段的索引将不起作用,如Price+10

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

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

1.使用HQL进行批量操作

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

01批量插入数据

@Test
    //03.HQL 批量添加
    public void multiInsertTest(){
        String hql="insert into Dept(deptName) select d.deptName||d.deptNo from Dept d where d.deptNo>0";
        session.createQuery(hql).executeUpdate();
    }

02.批量更新数据  @Test
    //03.HQL 批量修改
    public void multiUpdateTest(){
        String hql="update Dept set deptName=:name where deptNo>2";
        session.createQuery(hql).setParameter("name","财务部").executeUpdate();
    }

03.批量删除

@Test
    //03.HQL 批量删除
    public void multiDeleteTest(){
        String hql="delete from Dept d where d.deptNo>:deptNo";
        session.createQuery(hql).setParameter("deptNo",20).executeUpdate();
    }

2.使用JDBC API进行操作。数据库层面

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

@Test
    //04.JDBC API 批量修改
    public void insertTest(){
        Work work=new Work() {
            public void execute(Connection connection) throws SQLException {
                PreparedStatement ps = connection.prepareStatement("update DEPTY2163Session  set deptName='业务部'where DEPTNO>?");
                ps.setInt(1,1);
                ps.executeUpdate();
            }
        };
        //session
        session.doWork(work);
    }

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

3。使用Session 进行操作 会进缓存。

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

//05.Session 方案 进入缓存
    @Test
    public void insertUseSessionTest() {
        Emp emp=null;
        for (int i = 0; i < 100; i++) {
            emp=new Emp(i, "emp"+i);
            session.save(emp);
            if (i%30==0) {
                session.flush();
                session.clear();
            }
        }
    }

HQL连接查询的更多相关文章

  1. Hibernate批量处理数据、HQL连接查询

    一.批量处理操作 批量处理数据是指在一个事务场景中处理大量数据.在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作     数据库层面 ...

  2. HQL连接查询和注解

    HQL连接查询和注解 一:HQL连接查询 各种连接查询: 内连接:inner join或join From Entity inner [inner] join [fetch] Entity.prope ...

  3. 【学习笔记】Hibernate HQL连接查询和数据批处理 (Y2-1-7)

    HQL连接查询 和SQL查询一样 hql也支持各种链接查询 如内连接 外连接 具体如下 左外连接 left (outer) join 迫切左外连接 left (outer) join fetch 右外 ...

  4. Hibernate批量处理数据、[HQL连接查询]

    一.批量处理操作 批量处理数据是指在一个事务场景中处理大量数据.在应用程序中难以避免进行批量操作,Hibernate提供了以下方式进行批量处理数据: (1)使用HQL进行批量操作 数据库层面 (2)使 ...

  5. HQL的内连接查询

    /** * HQL的内连接查询 * String hql="from Customer c inner join fetch c.linkmans"; */ @Test publi ...

  6. hibernate-HQL连接查询

    和SQL查询一样,HQL也支持各种各样的连接查询, 如内连接.外连接. 实例: package Test; import static org.junit.Assert.*; import java. ...

  7. hibernate 实现多表连接查询(转载)

    http://www.cnblogs.com/lihuiyy/archive/2013/03/28/2987531.html 为了方便,直接粘过来,方便查看.不收藏了 Hibernate主要支持两种查 ...

  8. hql 关联查询

    HQL 带的连接语句只能是实体与 该实体的属性 进行连接 其意义就是为了优化(通过延迟加载查询关联的属性)需要进行配置 from A left join A.B where (b.flag is nu ...

  9. 一步步学习NHibernate(9)——连接查询和子查询(1)

    请注明转载地址:http://www.cnblogs.com/arhat 在前几章中,我们把HQL的基本查询学习了一下,但是只有基本查询很显然不能满足我们的需求,那么就需要一下复杂查询比如" ...

随机推荐

  1. mysql 二级索引

    mysql中每个表都有一个聚簇索引(clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引(secondary indexes). 以InnoDB来说,每个Inn ...

  2. js 日期控件laydate使用

    官网  http://sentsin.com/layui/laydate/ 1. 下载官网上的压缩包,解压后只需要复制laydate 文件夹到你的项目中; 2. 在页面引入  <script t ...

  3. ASP.NET AJAX注册命名空间

    AJAX库支持命名空间的概念. 类可以分组到不同的命名空间.AJAX库会自动创建在此层次中不存在的任何级别的命名空间. <%@ Page Language="C#" Auto ...

  4. android MessageQueue入门

    接触安卓几年了.但是感觉一直不是很明白,东西太多了.反过来说就是自己太菜了.很多东西其实都是模凌两可,不熟悉,很多知识点都是知道一点,最多大家都这样用.没问题,事件长了也一直这样用的.但是有个问题,安 ...

  5. 如何在微软Hyper-V下发挥SQL Server最大功效

    要建设稳定运行的虚拟化SQL Server系统,关键是确保虚拟化管理软件配置能提供数据库所需的资源.SQL Server是CPU密集型技术,因此支撑它的虚拟机需要能获得充足的处理器资源,同时不能引起与 ...

  6. 【转】10个重要的Linux ps命令实战

    Linux作为Unix的衍生操作系统,Linux内建有查看当前进程的工具ps.这个工具能在命令行中使用. PS 命令是什么 查看它的man手册可以看到,ps命令能够给出当前系统中进程的快照.它能捕获系 ...

  7. git 常用命令--Linus Torvalds

    1.git log 显示仓库的历史记录,默认显示所有记录, 1)git log -m,显示最近的几次提交,, 2)git log --pretty=oneline  显示提交hash和注释 -p 按补 ...

  8. IOS9中联系人对象的使用及增删改查操作的函数封装

    之前克服重重困难把IOS9中新的类联系人搞明白了,现在把增删改查封装成了函数,如下: // // ViewController.m // IOS9中联系人CNContact的使用 // // Crea ...

  9. IOS开发-UI学习-NSMutableAttributedString(带属性的字符串)的使用

    带属性的字符串: NSString *aa = @"hellochinaIloveYou!"; NSMutableAttributedString *mas = [[NSMutab ...

  10. Linux_System11

    1.查看/var目录的大小:1)ll -hd /var 查看目录的实际大小2)du -sh /var 查看目录所占磁盘空间大小修改权限:chmod 750 hunan修改属主和属组:groupadd ...