HQL查询——关联和连接
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查询——关联和连接的更多相关文章
- [原创]java WEB学习笔记91:Hibernate学习之路-- -HQL 迫切左外连接,左外连接,迫切内连接,内连接,关联级别运行时的检索策略 比较。理论,在于理解
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- HQL查询及Hibernate对c3p0连接池的支持
//HQL查询 // auto-import要设置true,如果是false,写HQL时要指定类的全名 //查询全部列 Query query = session.createQuery(" ...
- hibernate对连接池的支持和HQL查询
hibernate对连接池的支持 连接池, 作用: 管理连接:提升连接的利用效率! 常用的连接池: C3P0连接池 Hibernate 自带的也有一个连接池,且对C3P0连接池也有支持! 只维护一个连 ...
- SQL Fundamentals || 多表查询(内连接,外连接(LEFT|RIGHT|FULL OUTER JOIN),自身关联,ON,USING,集合运算UNION)
SQL Fundamentals || Oracle SQL语言 一.多表查询基本语法 在进行多表连接查询的时候,由于数据库内部的处理机制,会产生一些“无用”的数据,而这些数据就称为笛卡尔积. 多表查 ...
- 肤浅的聊聊关联子查询,数据集连接,TiDB代码,关系代数,等等
本章涉及的内容是TiDB的计算层代码,就是我们编译完 TiDB 后在bin目录下生成的 tidb-server 的可执行文件,它是用 go 实现的,里面对 TiPD 和 TiKV实现了Mock,可以单 ...
- 转: Hibernate HQL查询 插入 更新(update)实例
1.实体查询:有关实体查询技术,其实我们在先前已经有多次涉及,比如下面的例子:String hql=”from User user ”;List list=session.CreateQuery(hq ...
- hibernate的hql查询
1.概念介绍 1.Query是Hibernate的查询接口,用于从数据存储源查询对象及控制执行查询的过程,Query包装了一个HQL查询语句. 2.HQL是Hibernate Query Langua ...
- Hibernate5.2之HQL查询
Hibernate5.2之HQL查询 一. 介绍 Hibernate的 ...
- 第六讲(二) Hibernate HQL查询
HQL查询:Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Lanaguage)查询提供了更加丰富的和灵活的查询特性,因此Hibe ...
随机推荐
- MFC操作excel
环境:VS2013+office2007 头文件: #pragma once #ifndef __MYEXCEL_H_ #define __MYEXCEL_H_ #include "CApp ...
- 详解一个自己原创的正则匹配IP的表达式
这里给大家详细讲解一下一个匹配IP地址的正则表达式, 有关正则方面的知识,会在详细的讲解中提到. 在讲解之前,我先给大家介绍一下,ip地址的生成规则. IP地址,是由32位数字二进制转为四个十进制的字 ...
- Swift:属性观察器
1.简单介绍 属性观察器监控和响应属性值的变化,每次属性被设置值的时候都会调用属性观察器,甚至新的值和现在的值相同的时候也不例外. 可以为除了延迟存储属性之外的其他存储属性添加属性观察器,也可以通过重 ...
- Python之路【第十九章】:Django 数据库对象关系映射
Django ORM基本配置 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去 ...
- AFN和ASI区别
AFN和ASI区别 一.AFN和ASI的区别 1.底层实现1> AFN的底层基于OC的NSURLConnection和NSURLSession2> ASI的底层基于纯C语言的CFNetwo ...
- 区间重叠计算及IntervalTree初识
最近被人问到这样一个问题的解决方案:在一个餐馆的预定系统中,接受用户在未来任意一段时间内的预订用餐,用户在预订的时候需要提供用餐的开始时间和结束,餐馆的餐桌是用限的,问题是,系统要在最快的时间段计算出 ...
- CAS学习笔记(二)—— cas server端的login-webflow详细流程
一.配置文件介绍 关于spring的配置信息只需放入WEB-INF/spring-configuration目录即可,cas启动时会自动加载.这个目录下的spring配置文件几乎不需要改动. 在web ...
- [原创]java WEB学习笔记103:Spring学习---Spring Bean配置:基于注解的方式(基于注解配置bean,基于注解来装配bean的属性)
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- JSP中动态INCLUDE与静态INCLUDE的区别
动态INCLUDE 用法: <jsp:include page="included.jsp" flush="true" /> 说明: 它总是会检查所 ...
- html 关键字设定
<meta name="description" content="仡家油茶仡家油茶仡家油茶仡家油茶"> <meta name="k ...