HQL多表查询 ---- Hibernate之查询语句

叙:上一章节轻风记录的是HQL的单表查询,本章节就HQL的多表查询方式进行记录;


HQL查询数据

本章节主要学习的是HQL查询方式的表查询;

几种查询方式

1. 内连查询

查询语句比较奇怪,from Customer c inner join c.linkMens,查询Customer类所映射的表和Customer类中linkMens属性所代表的实体类的映射的数据库表;这句话很拗口,但是多读两遍理解理解就好了,重点理解的是linkMens是Customer类中的属性,linkMens是LinkMan实体类在Customer类中的对象属性,因此,在内连查询中也可以理解为,查询两张表中的数据,对一个类进行操作,但是这个类中必须含有另一个表的映射类的对象属性才行。具体的代码如下所示:

查询代码:

@Test
    // HQL的内连接
    public void demo1() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        String hql = " from Customer c inner join c.linkMens ";

        Query query = session.createQuery(hql);

        List<Object[]> list = query.list();

        for (Object[] arr : list) {
            System.out.println(Arrays.toString(arr));
        }

        bt.commit();
        session.close();
    }

要知道的是,既然是多表查询的内连查询,那么就应该考虑到之前学过的关联映射的知识,内连查询就是指查询类A中的一条数据a所关联的类B中的所有数据,因此可以视为(就是)“一对多”关系,因此,在类A的实体类中要有关联类B的对象集合;

在Customer类中的代码:

运行Demo后的结果:

从查询代码和查询结果中看得出,查询获得的数据是集合数组,因为内连查询获得的是以键值对的形式显示出来的,“键”是Customer类所映射的表中的数据,“值”是linkMens所代表的实体类所映射的数据表的数据;因此需要使用Object[]的范型进行约束;



2. 迫切查询

迫切查询,主要有两点和内连查询不同,第一点是,在查询语句中添加一个关键字,第二点是,由于查询语句变化导致的,导致查询到的结果显示形式不同,内连查询获得的数据是键值对的形式,而迫切查询获得的是合并后的数据形式,将两条数据合为一条新的并以主查询实体类的数据形式返回;

查询代码如下:

@Test
    // HQL迫切查询
    public void demo2() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        String hql = " from Customer c inner join fetch c.linkMens ";

        Query query = session.createQuery(hql);

        List<Customer> list = query.list();
        System.out.println(list);

        bt.commit();
        session.close();
    }

添加的关键字:fetch

这个例子中主查询类是Customer,所以其返回值的范型是Customer,运行的结果如下图所示:

从中可以看出,数据变成了一条一条的被放在以一个数据集合中;



3. 左外连接查询

首先左连接的特点是查询出来的结果,左边不能为空,右边可以为空,右连接与此相反;

在进行demo代码编写时先在两个表中分别加入一条没有关联的数据,既是LinkMan表中加入一条lkm_cust_id列为空的数据,在Customer表中加入一条只有cust_name数据的数据;

下边是demo的编写,和内连接只多一个关键字left;

@Test
    // HQL的左连接查询
    public void demo3() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        String hql = " from Customer c left join c.linkMens ";

        Query query = session.createQuery(hql);

        List<Object[]> list = query.list();

        for (Object[] arr : list) {
            System.out.println(Arrays.toString(arr));
        }
        bt.commit();
        session.close();
    }

查询到的结果如下:



4. 右外连接查询

和左外连接查询基本一样,只不过关键字和查询可为空、不可为空的像颠倒了;

代码:

@Test
    // HQL的右连接查询
    public void demo4() {
        Session session = HibernateUtils.openSession();
        Transaction bt = session.beginTransaction();

        String hql = " from Customer c right join c.linkMens ";

        Query query = session.createQuery(hql);

        List<Object[]> list = query.list();

        for (Object[] arr : list) {
            System.out.println(Arrays.toString(arr));
        }

        bt.commit();
        session.close();
    }

查询到的结果如下:



pass:一般情况下多表查询不会用HQL来进行,因为语法比较拗口(拗脑子),如果多表查询的话查询的表太多了就会导致语法混乱不易修改维护等;

pass~pass:下一章节记录QBC数据查询方式~


《本章完》

原文地址:https://www.cnblogs.com/Email-qtl777777/p/9651947.html

时间: 2024-12-12 17:14:57

HQL多表查询 ---- Hibernate之查询语句的相关文章

hibernate学习系列-----(4)hibernate基本查询上篇:HQL基本查询

紧接着上一篇,今天继续hibernate的学习总结,来聊一聊hibernate的基本查询方法,先说说HQL(hibernate Query Language):它是官方推荐的查询语言.在开始写代码之前,看看需要做哪些准备工作吧,首先,在我们的学生类中新增一个属性"clazz",其实不加也可以,接着,我们需要重写Student.java类中的toString()方法,代码如下: /** * 重写toString方法 */ @Override public String toString(

Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询

本笔记继续使用dept部门表,emp员工表,一对多多对一双向映射. 1 条件查询 1.1    查询 员工表emp中 年龄eage小于30,月薪esal大于20000的员工姓名ename sql:select ename from emp where eage<? and esal >?; hql: select ename from Emp where eage<? and esal >? 1.2 问号的设置与别名 问号(?)的设置使用.setParameter(位置, 属性值)

Hibernate框架之HQL查询与Criteria 查询的区别

Hibernate框架提供了HQL查询和Criteria 查询.下面对这两种查询分别做个例子.也好对这两种查询方法有个大概的了解.就用房屋信息表做例子,查询所有房屋信息. HQL语句查询所有房屋信息: /* * 查询所有房屋 * * (non-Javadoc) * @see Dao.HouseDao#selecthouse() */ public List<House> selecthouse() { // TODO Auto-generated method stub //获取连接 Sess

hibernate框架学习笔记7:HQL查询、Criteria查询

HQL查询:hibernate独有的查询语言 适用于不复杂的多表查询 示例: 实体类: package domain; public class Customer { private Long cust_id; private String cust_name; private String cust_source; private String cust_industry; private String cust_level; private String cust_linkman; priv

HQL多表查询

------------------siwuxie095 HQL 多表查询 以客户和联系人为例(一对多) 1.内连接 (1)hql 语句写法 from Customer c inner join c.linkManSet (2)具体实现 /* * (1) 创建 Query 对象 * * 调用 session 的 createQuery() 方法,参数是 hql * 语句,返回值是 Query 类型,创建以接收 */ Query query=session.createQuery("from Cu

Hibernate HQL一对多 在一方的查询

首先说一句:是版本的问题! 在多对多或者多对一,从一中查找多中查询某些语句时容易出现 我写的hql为: from Department as d where d.employees.name='Tom'; 运行时出现异常:org.hibernate.QueryException: illegal attempt to dereference collection 是因为:在上面的HQL语句中,Department的关联实体employees是一个集合,而不直接是一个Employee实体. 在Hi

多表查询,子查询,及查询语句中语句执行的先后顺序和特点

对多张表进行查询操作 查询方式1: 笛卡尔积查询 select * from 表1,表2; 结果:让表1中的每一条记录和表2中每一条记录一次组合 表1 n条记录 表2 m条记录 最终查询结果:n * m 条 注意: 1.观察笛卡尔积查询的最终结果,很多数据没有实际作用 2.查询结果太多,对内存压力大 笛卡尔积查询优化(内连接) 加上条件 隐式内连接 select * from 表1,表2 where 表1.字段 = 表2.字段; 显示内连接语法 select * from 表1 inner jo

SQL语句汇总(终篇)—— 表联接与联接查询

既然是最后一篇那就不能只列出些干枯的标准语句,更何况表联接也是SQL中较难的部分,所以此次搭配题目来详细阐述表联接. 上一篇博文说到相关子查询效率低下,那我们怎么能将不同表的信息一起查询出来呢?这就需要用到表联接. 和之前的UNION组合查询不同,UNION是将不同的表组合起来,也就是纵向联接,说白了就是竖着拼起来. 而表联接是通过笛卡尔乘积将表进行横向联接,所谓的通过笛卡尔乘积简单说就是两表的行依次相联再相加.要想更详细的理解可以百度下,毕竟本文主要是汇总SQL语句. 现在有如下两张表: 这是

MYSQL优化派生表(子查询)在From语句中的

Mysql 在5.6.3中,优化器更有效率地处理派生表(在from语句中的子查询): 优化器推迟物化子查询在from语句中的子查询,知道子查询的内容在查询正真执行需要时,才开始物化.这一举措提高了性能: 1:之前版本(5.6.3),from语句中的子查询在explain select 查看执行计划语句执行时就会物化.它导致了部分查询执行,但explain语句的目的是获取执行计划信息,而不是执行查询 该版本物化不会在explain中发生,所以explain执行计划结果的得到更快: 2:因为上面提及