第一:sql和hql中join语句区别
1,sql中join操作可以用到任何两个表中,其包括inner join,left join,right join,通过on指定连接条件。
2,hql是sql的面向对象版,也包括inner join,left join,right join。但其join只能用在有关联关系的对象间,无关联关系的对象不能使用,且由于有关联关系的对象其关联外键已经在配置文件中配置了,故而hql中的join操作无须指定on 条件,Hibernate会自动附加连接条件。
第二:hibernate中内连接,迫切内连接,左外连接,迫切左外连接,右外连接的区别
连接查询:
关系型数据库之所以强大,其中一个原因就是可以统一使用表来管理同类数据信息,并且可以在相关数据之间建立关系。作为支持关系型数据库的SQL语句来说,自然要对全面发挥这种强大功能提供支持,这个支持就是连接查询。
同样作为一种关系型数据库的持久层框架,Hibernate也对连接查询提供了丰富的支持,在Hibernate中通过HQL与QBC两种查询方式都可以支持连接查询。
下面这一部分我们将通过这两种查询技术,来详细讨论有关 Hibernate对连接查询支持的各个细节。在讲解连接查询之前,我们先来回忆一下在第一部分中讲解的有关实体关联关系的映射,在实体的配置文件中可以通过配置集合元素来指定对关联实体的映射以及检索策略。
因此我们可以在实体映射配置文件中,指定关联实体检索策略,对关联实体的检索策略可以指定为“延迟检索”,“立即检索”,“迫切左外连接检索”,如下所示对与Customer实体关联的Order实体设置延迟加载:,这种在实体映射配置文件中设定的检索策略,称为默认检索策略,但是这种默认检索策略是可以被覆盖的,那就是在程序代码当中可以动态指定各种迫切检索策略来覆盖默认检索策略。
1、 迫切左外连接查询和左外连接查询:
我们看以下代码,这段代码将覆盖映射文件中的检索策略,显示指定采用迫切左外连接查询。
HQL查询方式:
Query query=session.createQuery(“from Customer c left join fetch c.orders o where c.name like ‘zhao%’ ”);
List list=query.list();
for(int i=0;i <list.size();i++){>
Customer customer=(Customer)list.get(i);
}
//QBC检索方式:
List list=session.createCriteria(Customer.class).setFetchMode(“orders”,FetchMode.EAGER)
.add(Expression.like(“name”,”zhao%”,MatchMode.START).list();
for(int i=0;i <list.size();i++){>
Customer customer=(Customer)list.get(i);
}
我们看到在HQL以及QBC查询中分别通过left join fetch和FetchMode.EAGER来指定采用迫切左外连接检索策略,当采用了迫切左外连接检索策略时,当进行检索时即执行查询的list()方法时,将会立即初始化用来容纳关联实体的集合对象元素,如果在实体映射配置文件中对关联实体设置了延迟加载,那么此时将会忽略延迟加载设置,而采用迫切左外连接策略,并且立即用关联实体对象填充集合对象元素,即使用Order对象填充Customer对象的orders集合。因此这种检索策略会马上创建关联实体对象,此时我想你一定会想到这种检索策略会同时检索出Customer和Order实体对象对应的数据,并且分别创建这两个对象。恭喜你答对了,因此上面代码会生成类似如下的SQL语句:
Select * from customer c left join order o on c.id=o.id where c.name like ‘zhao%’;
如果我们忽略了fetch关键字,就变成了左外连接查询,如下面代码:
Query query=session.createQuery(“from Customer c left join c.orders o where c.name like ‘zhao%’ ”);
List list=query.list();
for(int i=0;i <list.size();i++){>
Object[] objs=(Object[])list.get(i);
Customer customer=(Customer) objs[0];
order order=(Order)objs[1];
}
我们可以看到采用左外连接查询返回的结果集中包含的是对象数组,对象数组中的每个元素存放了一对相互关联的Customer对象和Order对象,而迫切左外连接会返回Customer对象,与Customer对象相关联的Order对象存放在Customer对象的集合元素对象中,这就是迫切左外连接和左外连接查询的其中一个区别(这两种检索生成的SQL语句是一样的),另一个区别是当使用左外连接时,对关联对象的检索会依照实体映射配置文件所指定的策略,而不会像迫切左外连接那样忽略它,比如此时对Customer对象关联的Order对象采用延迟加载,那么左外连接检索也会使用延迟加载机制检索 Order对象。
2、内连接,迫切内连接以及隐式内连接:
若采用迫切内连接通过一下代码可以实现:
Query query=session.createQuery(“from Customer c inner join fetch c.orders o where c.name like ‘zhao%’ ”);
List list=query.list();
for(int i=0;i <list.size();i++){>
Customer customer=(Customer)list.get(i);
}
这段代码将会采用迫切内连接检索,对集合元素的检索策略以及返回结果集中的对象类型都采用与迫切左外连接一样的方式,我这里就不再赘述,另外QBC查询不支持迫切内连接检索。
如果去掉fetch就是内连接检索,如下面代码:
Query query=session.createQuery(“from Customer c innerjoin c.orders o where c.name like ‘zhao%’ ”);
List list=query.list();
for(int i=0;i <list.size();i++){>
Object[] objs=(Object[])list.get(i);
Customer customer=(Customer) objs[0];
order order=(Order)objs[1];
}
内连接检索,对集合元素的检索策略以及返回结果集中的对象类型都采用与左外连接一样的方式,QBC查询也同样支持内连接检索,如下代码:
List list=session.createCriteria(Customer.class)
.add(Expression.like(“name”,”zhao%”,MatchMode.START))
.createCriteria(“orders”)
.add(Expression.like(“ordernumber”,”T”,MatchMode.START)).list();
上面代码等价于如下的HQL语句:
Select c from Customer c join c.orders o where c.name like ‘zhao%’ and o.ordernummber like ‘T%’;因此可以采用下面的方式访问结果集:
for(int i=0;i <list.size();i++){>
Customer customer=(Customer)list.get(i);
}
由此可见,采用内连接查询时,HQL与QBC查询有不同的默认行为,HQL会检索出成对的Customer和Order对象,而QBC仅会检索出Customer对象。如果QBC查询想检索出成对的Customer和Order对象,可以采用如下代码:
List list=session.createCriteria(Customer.class)
.createAlias(“orders”,”o”)
.add(Expression.like(“this.name”,”zhao%”,MatchMode.START))
.add(Expression.like(“ordernumber”,”T”,MatchMode.START))
.returnMap()
.list();
for(int i=0;i <list.size();i++){>
Map map=(Map)list.get(i);
Customer customer=(Customer)map.get(“this”);
order order=(Order)map.get(“o”);
}
“o”和”this”分别是orders集合和Customer对象的别名。
在HQL查询中,还有一种查询成为隐式内连接,我们看下面的HQL语句,
From order o where o.customer.name like ’ zhao% ’;这个语句通过o.customer.name访问与Order对象关联的Customer对象的name属性,尽管没有使用join关键字,其实隐式指定了采用内连接检索,它和下面这条HQL语句等价:
From order o join o.customer c where c.name like ‘zhao%’;
隐式内连接只适用于多对一和一对一关联,不适用于一对多和多对多关联,另外QBC查询不支持隐式内连接检索。
3、右外连接检索:
由于fetch关键字只能应用于innner join和left join,因此对于右外连接检索而言,就不存在所谓的迫切右外连接查询了,使用右外连接见如下代码:
Query query=session.createQuery(“from Customer c right join c.orders o where c.name like ‘zhao%’ ”);
List list=query.list();
for(int i=0;i <list.size();i++){>
Object[] objs=(Object[])list.get(i);
Customer customer=(Customer) objs[0];
order order=(Order)objs[1];
}
右外连接检索,对集合元素的检索策略以及返回结果集中的对象类型都采用与左外连接一
总结:
第一:左外连接和迫切左外连接检索策略区别
HQL:左连接采用配置的默认加载规则,返回对象数组。迫切左外连接检索策略采用立即查询,返回对象集。
QBC:支持迫切左外连接检索策略,返回对象集。
第二:内连接和迫切内连接检索策略区别
HQL:内连接采用配置的默认加载规则,返回对象数组。迫切内外连接检索策略采用立即查询,返回对象集。
QBC:采用内连接检索策略时返回的和HQL的迫切内外连接检索策略一样,返回对象集,但也可以通过别的方式返回对象映射集。
第三:右外连接
右外连接没有相应的迫切右外连接,所以HQL只能采用右外连接查询出对象数组。
相关推荐
在数据库查询中,连接...总之,掌握Hibernate中的内连接和左外连接是Java开发人员进行数据库操作的重要技能。通过理解和灵活运用这两种连接类型,我们可以编写出更高效、更具表现力的查询,从而提高应用的整体性能。
HQL支持多种连接查询方式,包括内连接、左外连接等,并且可以通过`fetch`关键字来明确指定关联级别的查询策略。 #### 各种连接查询详解 - **内连接(Inner Join)** - 语法:`[inner]join` - 描述:内连接只返回...
4. **全外连接(Full Outer Join)**:虽然HQL本身不支持全外连接,但可以通过组合左外连接和右外连接来模拟实现。 #### 五、应用场景 在实际开发中,HQL关联查询的应用场景非常广泛,特别是在需要跨多个实体进行...
连接类型包括:`inner join`(内连接)、`left outer join`(左外连接)、`right outer join`(右外连接)和`full join`(全连接)。`join`的简写形式如`from Cat as cat join cat.kittens as kitten`,简化了查询...
这些示例分别执行内连接、左外连接和左外连接。连接类型参照ANSI SQL,包括`inner join`、`left outer join`、`right outer join`和`full join`。简写形式如`join`和`left join`也是允许的。 ### 4. `with`关键字 ...
HQL支持内连接、左外连接、右外连接和全连接,其语法如下: ```sql FROM Cat AS cat INNER JOIN cat.mate AS mate LEFT OUTER JOIN cat.kittens AS kittens ``` 这表示,将`Cat`实体与`mate`和`kittens`关联的实体...
HQL 支持多种类型的连接操作,包括内连接、左连接、右连接和全连接。这些连接操作可以帮助开发人员在多个表之间建立关联,从而实现更复杂的查询需求。 1. **内连接**: ```hql select employee.ID as id1, ...
HQL(Hibernate Query Language)是 Hibernate 中的一种强大的查询语言,它看起来很像 SQL,但是不要被语法结构上的相似所迷惑,HQL 是非常有意识的被设计为完全面向对象的查询,它可以理解如继承、多态和关联之类的...
Hibernate 支持多种方式来实现多表连接查询,包括 HQL(Hibernate Query Language)和 Criteria 查询。本项目主要关注 Criteria API 的使用,这是一种基于 Java 对象的查询方式,更加灵活且易于理解和维护。 **...
HQL支持SQL的连接查询,包括内连接、左外连接、右外连接和全连接(不常用)。例如,使用内连接: ```java select a.id, b.id from A a inner join B b on a.id = b.id ``` 等价于SQL中的`INNER JOIN`。查询结果通常...
还有左外连接(`left outer join`)、右外连接(`right outer join`)和全连接(`full join`),但全连接在HQL中并不常用。简写形式如`join`和`left join`可用于内连接和左外连接。`fetch`连接允许在查询中初始化相...
本篇文档将深入探讨Hibernate中的HQL(Hibernate Query Language),一种面向对象的查询语言,它提供了与SQL类似的语法,但更贴近于面向对象的思维模式,使得开发者可以更加便捷地进行数据查询。 一、HQL简介 HQL是...
HQL支持四种类型的连接:inner join(内连接)、left outer join(左外连接)、right outer join(右外连接)和full join(全连接)。简写形式如`join`和`left join`也是允许的。`fetch`连接用于一次性初始化相关联...
- **Right Outer Join (右外连接)**:与左外连接相反,右表中的所有记录都会出现在结果集中。 - **Full Outer Join (全外连接)**:表示两个表中的所有记录都会出现在结果集中,如果某一边没有匹配,则会用NULL填充。...
HQL(Hibernate Query Language)是Hibernate框架中用于操作对象关系映射(ORM)的查询语言,它是SQL的面向对象版本,使得开发者可以更方便地在Java应用中进行数据库查询。本教程将深入讲解HQL的基础语句,包括ID...
HQL支持内连接(INNER JOIN)、左连接(LEFT JOIN)等,可以方便地处理关联关系。例如: ```sql SELECT s, c FROM Student s LEFT JOIN s.courses c ``` 这个查询将返回每个学生及其所有关联的课程。 **6. HQL的聚合...
首先,本地SQL查询(Native SQL)是指直接在Hibernate中使用原生的SQL语句进行查询,而不是使用HQL(Hibernate Query Language)。这允许开发者充分利用SQL的功能,比如进行复杂的统计计算或者处理特定数据库的特性...
2. **连接查询**:HQL支持内连接(inner join)、左外连接(left outer join)等多种类型的连接查询。这些连接方式与SQL中的连接查询类似,但在HQL中更加简洁明了。 3. **条件过滤**:HQL支持使用`WHERE`子句来进行条件...
- 支持多种连接类型,包括 `inner join`(内连接)、`left outer join`(左外连接)、`right outer join`(右外连接)和 `full join`(全连接)。其中,`full join` 不太常用。 - `join` 关键字还可以简写,例如 `...
HQL支持多种类型的关联查询,如内连接(inner join)、左连接(left join)、右连接(right join)和全连接(full join)。例如,`from Order as o inner join o.products as p`表示对Order与Product之间的关联进行...