HQL查询——关联和连接

  为了便于理解有关的使用关联和连接进行HQL查询,首先提供两个具有关联关系的持久化类:Person类和MyEvent类

Person类:

import javax.persistence.CollectionTable;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity    //标识这是一个持久化类
@Table(name="person_info")    //    指定此持久化类对应的表名
public class Person {
    @Id    @Column(name="p_id")    //标识主键    指定主键列的列名
    @GeneratedValue(strategy=GenerationType.IDENTITY)    //定义主键的生车策略为自增长
    private Integer id;
    @Column(name="p_name")
    private String name;
    @Column(name="p_age")
    private int age;
    //定义该实体对应的MyEvent实体
    @ManyToOne(targetEntity=MyEvent.class)
    //设置外键
    @JoinColumn(name="event_id",referencedColumnName="event_id")
    private MyEvent myEvent;
    //定义一个集合属性
    @ElementCollection(targetClass=String.class)
    //设置关联表
    @CollectionTable(
            name="person_email_info",
            joinColumns=@JoinColumn(name="person_id",nullable=false)
            )
    @Column(name="email_detail",nullable=false)
    private Set<String> emails = new HashSet<>();
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public MyEvent getMyEvent() {
        return myEvent;
    }
    public void setMyEvent(MyEvent myEvent) {
        this.myEvent = myEvent;
    }
    public Set<String> getEmails() {
        return emails;
    }
    public void setEmails(Set<String> emails) {
        this.emails = emails;
    }
}

Myevent类:

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;

public class MyEvent {
    @Id    @Column(name="event_id")
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Integer id;
    @Column(name="event_title")
    private String title;
    @Column(name="event_happenDate")
    private Date happenDate;
    @ManyToMany(targetEntity=Person.class,mappedBy="myEvent")
    private Set<Person> actors = new HashSet<>();
    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public Date getHappenDate() {
        return happenDate;
    }
    public void setHappenDate(Date happenDate) {
        this.happenDate = happenDate;
    }
    public Set<Person> getActors() {
        return actors;
    }
    public void setActors(Set<Person> actors) {
        this.actors = actors;
    }
}

1.HQL支持两种关联连接(join)形式:隐式和显式。

2.隐式连接形式不使用join关键字,而是使用“.”来隐式连接关联的实体,在Hibernate底层自动实现关联查询。

from Person p where p.myEvent.title >: title

3.显式连接则需要使用xxx join关键字。

from Person p

inner join p.myEvent event

where event.happenDate <: endDate

在使用显示链接时可以为相关联的实体或关联集合中的全部元素指定一个别名。

4.Hibernate支持的HQL连接类型直接借鉴了SQL99多表查询的关键字,可使用如下几种连接方式:

(1)inner join(内连接),可简写成join。

(2)left outer join(左外连接),可简写成left join。

(3)right outer join(右外连接),可简写成right join。

(4)full join(全连接),不常使用。

5.使用显式连接时,还可以通过HQL的with关键字来提供额外的连接条件。如:

from Person p

inner join p.myEvent event

with p.id > event.id

where event.happenDate <: endDate;

Hibernate会将这种显式连接转换成SQL99的多表连接语句,HQL中为with关键字基本等同于SQL99中的关键字on也是用于指定额连接外条件的。

6.对于HQL的显式连接和隐式连接有如下两种区别:

(1)隐式连接底层将转换成SQL99的交叉连接,显式连接将转化成SQL99的inner join、left join和right join等连接;

(2)隐式连接和显式连接查询后返回的结果不同:

  使用隐式连接查询返回的结果是多个被查询实体组成的集合。

  当使用显式连接查询的HQL语句中省略select关键字是,返回的结果也是集合,但集合元素是被查询的持久化对象、所有被关联的持久化对象所组成的数组。

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

  1. [原创]java WEB学习笔记91:Hibernate学习之路-- -HQL 迫切左外连接,左外连接,迫切内连接,内连接,关联级别运行时的检索策略 比较。理论,在于理解

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  2. HQL查询及Hibernate对c3p0连接池的支持

    //HQL查询 // auto-import要设置true,如果是false,写HQL时要指定类的全名 //查询全部列 Query query = session.createQuery(" ...

  3. hibernate对连接池的支持和HQL查询

    hibernate对连接池的支持 连接池, 作用: 管理连接:提升连接的利用效率! 常用的连接池: C3P0连接池 Hibernate 自带的也有一个连接池,且对C3P0连接池也有支持! 只维护一个连 ...

  4. SQL Fundamentals || 多表查询(内连接,外连接(LEFT|RIGHT|FULL OUTER JOIN),自身关联,ON,USING,集合运算UNION)

    SQL Fundamentals || Oracle SQL语言 一.多表查询基本语法 在进行多表连接查询的时候,由于数据库内部的处理机制,会产生一些“无用”的数据,而这些数据就称为笛卡尔积. 多表查 ...

  5. 肤浅的聊聊关联子查询,数据集连接,TiDB代码,关系代数,等等

    本章涉及的内容是TiDB的计算层代码,就是我们编译完 TiDB 后在bin目录下生成的 tidb-server 的可执行文件,它是用 go 实现的,里面对 TiPD 和 TiKV实现了Mock,可以单 ...

  6. 转: Hibernate HQL查询 插入 更新(update)实例

    1.实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql=”from User user ”;List list=session.CreateQuery(hq ...

  7. hibernate的hql查询

    1.概念介绍 1.Query是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程,Query包装了一个HQL查询语句. 2.HQL是Hibernate Query Langua ...

  8. Hibernate5.2之HQL查询

    Hibernate5.2之HQL查询                                                                  一. 介绍 Hibernate的 ...

  9. 第六讲(二) Hibernate HQL查询

    HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此Hibe ...

随机推荐

  1. C++学习笔记 知识集锦(一)

    1.内存管理的开销 2.函数调用框架 3.类为什么要定义在头文件 4.C++的组合 5.在类的外部定义成员函数 6.bool类型为什么可以当做int类型 7.无符号保留原则 8.C++类型检查 9.何 ...

  2. shell中{}的妙用

    shell中${}的妙用   1. 截断功能 ${file#*/}:       拿掉第一条/及其左边的字符串:dir1/dir2/dir3/my.file.txt ${file##*/}:    拿 ...

  3. Redhat 7 或者 CentOS 7 密码破解

    1.在如下界面按 e 2.在 linux16 这一行的最后面添加 rd.break,然后按 ctrl + x 进入单用户模式 3.以读写的方式重新挂载 sysroot 4.切换到 sysroot 目录 ...

  4. lua自定义迭代器

    迭代器 http://www.tutorialspoint.com/lua/lua_iterators.htm 迭代器能够让你遍历某个集合或者容器中的每一个元素. 对于lua来说, 集合通常指代 ta ...

  5. SSIS 连接ORACLE 无法从 SQL 命令中提取参数的解决方案

    第一步:  定义包变量:maxdate 类型为String  定义包变量:sqlStatement类型为String,值为:select * from i_out_serv_mon 第二步:  取&q ...

  6. iOS 版 MWeb 发布到自建 Wordpress 和 Metaweblog API 使用指南

    MWeb 的发布服务的使用方法是先增加发布服务,再使用.在 iOS 中,要增加发布服务,可以在首页中,点左上角的 "设置" 按钮,进入设置界面,并滑动到底部,就会看到增加发布服务的 ...

  7. 显示python已安装模块及路径,添加修改模块搜索路径

    在python交互模式下输入: help('modules') #可以显示出已安装的模块 在python交互模式下输入: import sys sys.path #可以显示出模块搜索路径 增加搜索路径 ...

  8. Ubuntu 下安装 Mysql

    这里讲用Ubuntu下安装MySql ubuntu上安装mysql非常简单只需要几条命令就可以完成. 1. sudo apt-get install mysql-server   2. apt-get ...

  9. 显示textarea内容的时候没有自动换行

    显示textarea内容的时候没有自动换行,网上找了好久,在一个论坛里找到解决方法: 1.把从数据库读出来的内容存放在一个Div内,例如: <div class="new-commen ...

  10. Adobe AIR对本地文件(XML文件)的操作

    引用:http://addiwang.blog.163.com/blog/static/118130772011221114230288/ Air的文件操做主要涉及两个类,FIle和FileStrea ...