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. 在eclipse中使用正则表达式进行搜素

  2. 各种同步方法性能比较(synchronized,ReentrantLock,Atomic)

    synchronized: 在资源竞争不是很激烈的情况下,偶尔会有同步的情形下,synchronized是很合适的.原因在于,编译程序通常会尽可能的进行优化synchronize,另外可读性非常好,不 ...

  3. LeetCode Paint House II

    原题链接在这里:https://leetcode.com/problems/paint-house-ii/ 题目: There are a row of n houses, each house ca ...

  4. web前端开发培训和自学 哪种选择更适合你

    web前端相对于其他软件开发是比较容易入门的,但是如果深入学习就比较困难了,这门技能需要从业人员掌握一定的设计.代码.交互技能和一些SEO技能,容易入门还涉及这么多知识和技能,那学习web前端开发到底 ...

  5. Eclipse 的单步调试(转)

    1.设置断点在程序里面放置一个断点,也就是双击需要放置断点的程序左边的栏目上.2.调试(1)点击"打开透视图"按钮,选择调试透视图,则打开调试透视图界面,然后先设置断点,按调试按钮 ...

  6. Python之路----------迭代器

    直接用作于for循环的数据类型有以下几种: 1.集合类的数据类型:list tuple dict set str等 2.生成器generator,包括生成器和带有yiled 的generator fu ...

  7. java实现excel表格导出数据

    /** * 导出清单 eb中 firstRow(EntityBean) 列表第一行数据,键值对(不包含序号)例:("name","姓名") * data(Ent ...

  8. ubuntu安装mysql--PC端

    sudo apt-get update sudo apt-get install mysql-server mysql-client //密码:mmchong sudo netstat -tap|gr ...

  9. CUtilityCode

    (1) 基于boost的生产者/消费者队列 template<typenameData> classconcurrent_queue { private: std::queue<Da ...

  10. noi 1.5 45:金币

    描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天)里,每天收到两枚金币:之后三天(第四.五.六天)里,每天收到三枚金币:之后四天(第七.八.九.十天)里, ...