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. ES6 基础知识

    let:用来定义变量特点:只能在代码块里面使用,let拥有块级作用域;并且let不允许重复声明; 比如: var a = 12; var a = 5; alert(a); //5; let a = 1 ...

  2. SqlServer触发器判断对表操作类型(增、删、改)并将修改后的数据映射到新表

    该文章为原创,日后可能会根据实际开发经验和网友评论,进行相应地方修改,为获得最新博客动态,望在转发博客的时候注明出处. 触发器要实现的功能: (1)获取对表Table1数据操作操作类型(insert. ...

  3. shell面试题目总结

    1.如何理解shell脚本中第一行#!/bin/sh #!为特殊的表示符,其后是解释此脚本的shell的路径.此脚本使用/bin/sh进行解释执行. 2.如何向脚本传递参数. 脚本名字 参数1 参数2 ...

  4. vim - buffer

    1. buffer switching http://vim.wikia.com/wiki/Easier_buffer_switching :buffer:ls:files 2. vim defaul ...

  5. Java实现冒泡排序

    冒泡排序思想就是将数列的相邻两个数比较,较大的数往后保存,小的数往前. package Sort; import java.util.Arrays; public class BubbleSort { ...

  6. 数据库触发器inserted和deleted详解

    create trigger updateDeleteTime on user for update as begin   update user set UpdateTime=(getdate()) ...

  7. 从 IClassFactory 为 CLSID 为 {00024500-0000-0000-C000-000000000046} 的 COM 组件创建实例失败,原因是出现以下错误: 8001010a解决办法

    1.在命令行中输入:dcomcnfg,会显示出“组件服务”管理器 2.打开“组件服务->计算机->我的电脑->DCOM 配置”,找到“Microsoft Word文档”,单击右键,选 ...

  8. 关于JS嵌套点击事件的问题。

    $().click() 是点击命令$().click(function(){代码}) 是绑定click事件,并不会直接运行.所以在嵌套的时候就有可能出现重复绑定的问题.下面是使用jsonp跨站访问代码 ...

  9. 总结ThinkPHP使用技巧经验分享(三)

    add方法返回主键(id)的值在往数据表中添加数据时调用add方法,默认返回值就是刚添加的id值,就不用再去查询了. save方法返回值的判断在修改数据时,如果修改成功返回的是被修改的记录数0,1,2 ...

  10. spring Date JPA的主要编程接口

    Repository:最顶层的接口,是一个空接口,主要目的是为了同一所有Repository的类型,并且让组件扫描的时候自动识别. CrudRepository:是Repository的子接口,提供增 ...