Spring中@Query实现hql的四种连接
我们有的时候需要多表联合查询,当然在mysql
中我们通过建视图来加快我们查询的速度,也可以直接写sql
语句来实现。但是在java
中,我们也可以用hql
面向对象的语言来进行查询。一起来看一下hql
如何用。
前言
如果你想了解mysql
的inner join, left outer join, right outer join, cross join
话,我建议你先用navicat
一款非常优秀的跨平台数据库可视化软件建一下视图,自己看一眼建完之后生成的sql
语句,我刚开始学和写hql
语句的时候我都会看一下他们生成的sql
语句是什么样的,然后给自己一点儿思路。
框架:Spring
环境:Ubuntu, IDEA
SQL的四种连接
数据表
user表
id | name | password |
---|---|---|
1 | aaa | 123 |
2 | bbb | 456 |
3 | ccc | 789 |
teacher表
id | name | professor |
---|---|---|
1 | lisi | aaa |
2 | zhangsan | ddd |
inner join
典型的联接运算,使用像 = 或 <> 之类的比较运算符
假如运算是”=”,然后我们就可以找到两张表中列的值相同的记录。
for example
我们可以这样写sql
语句:
然后我们就可以看到找到了user
表name
列和teacher
表中professor
列的值相同的记录:
name | id | password | id | name | professor |
---|---|---|---|---|---|
aaa | 1 | 123 | 1 | lisi | aaa |
left join
左向外连接的结果集包括LEFT OUTER子句中指定的左表的所有行,而不仅仅是连接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
for example
我们可以这样写sql
语句:
name | id | password | id | name | professor |
---|---|---|---|---|---|
aaa | 1 | 123 | 1 | lisi | aaa |
bbb | 2 | 456 | NULL | NULL | NULL |
ccc | 3 | 789 | NULL | NULL | NULL |
right join
右向外连接是左向外连接的反向连接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
for example
我们可以这样写sql
语句:
name | id | password | id | name | professor |
---|---|---|---|---|---|
aaa | 1 | 123 | 1 | lisi | aaa |
NULL | NULL | NULL | 2 | zhangsan | ddd |
cross join
交叉连接返回左表中的所有行,左表中的每一行与右表中的所有行组合。交叉连接也称作笛卡尔积。
for example
我们可以这样写sql
语句:
name | id | password | id | name | professor |
---|---|---|---|---|---|
aaa | 1 | 123 | 1 | lisi | aaa |
aaa | 1 | 123 | 2 | zhangsan | ddd |
bbb | 2 | 456 | 1 | lisi | aaa |
bbb | 2 | 456 | 2 | zhangsan | ddd |
ccc | 3 | 789 | 1 | lisi | aaa |
ccc | 3 | 789 | 2 | zhangsan | ddd |
hql实现
如果你没有写任何hql
的经历,那么请自己在参考文章的连接中自己学习哦!
Entity
Employee.java
Company.java
我们在数据库中准备如下数据Company
id | comp_name |
---|---|
1 | ABCD |
2 | EFGH |
Employee
id | emp_name | comp_id |
---|---|---|
1 | Mohan | 2 |
2 | Sohan | 1 |
3 | Ramesh | 2 |
left join
在Spring
中,我们可以在@Query
中写hql
语句查询,也可以写原生的sql
语句查询。下面我们就用hql
来完成left join
CompanyRepository.java
|
|
然后我们打印出来,就会发现下面的数据:
|
|
总结
第一次用java
,第一次用hql
,第一次直接写多表联合查询。刚开始的时候无从下手。刚开始看Spring
的官方文档一头雾水,后来经潘老师一说,我开始用navicat
,从建立视图,然后看生成的sql
语句。然后找博客看sql
的内连接,外连接。最后学习hql
,然后在回过头来看Spring
的文档实现简单的查询。然后在实践中一点一点理解。
参考文章
5.3.4. Using @Query Spring docs
Hibernate HQL Associations and inner join, left outer join, right outer join, cross join Example
JPA: Query that returns multiple entities stackoverflow
第 15 章 HQL: Hibernate 查询语言
SQL 左外连接,右外连接,全连接,内连接