首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在右外部联接上获取hql

在右外部联接上获取hql
EN

Stack Overflow用户
提问于 2014-05-16 02:43:01
回答 1查看 3.3K关注 0票数 2

场景

我有两个表- Region和Substation。一个地域可以有多个变电站,但一个变电站只能属于一个地域。此外,一个地区不能有任何变电站。即没有变电站的区域。

在model类中,我有两个类: Region和Substation。Substation包含一个Region类型的字段,这就是我在Region和Substation之间建立外键关系的方式。

我在Hibernate查询语言上做右外部连接,如下所示:

代码语言:javascript
运行
复制
from Substation sub right outer join fetch sub.region

我之所以执行右外部连接,是因为在查询执行后返回的列表中,我还希望显示没有变电站的区域。

数据库

这是我的region表的样子:

代码语言:javascript
运行
复制
mysql> select * from region;
+----+----------------+-------+
| id | name           | state |
+----+----------------+-------+
|  1 | Entire Network |       |
|  4 | aa             | AK    |
-------Data abbreviated due to space consumption-------

这是我的变电站表的样子:

代码语言:javascript
运行
复制
mysql> select * from substation;
+---------+-------------+-----------+-----------+----+
| name    | lon         | lat       | region_id | id |
+---------+-------------+-----------+-----------+----+
| aga     |    3.000000 | 23.000000 |         1 |  1 |
| sjstest |   46.000000 | 22.100000 |         7 |  2 |
----------Data abbreviated due to space consumption--------

在右外部连接之后,我得到的是:

代码语言:javascript
运行
复制
mysql> select * from substation right outer join region on region.id=substation.region_id;
+---------+-------------+-----------+-----------+------+----+----------------+-------+
| name    | lon         | lat       | region_id | id   | id | name           | state |
+---------+-------------+-----------+-----------+------+----+----------------+-------+
| aga     |    3.000000 | 23.000000 |         1 |    1 |  1 | Entire Network |       |
| addtest | -104.501953 | 47.813155 |         1 |    8 |  1 | Entire Network |       |
| NULL    |        NULL |      NULL |      NULL | NULL |  4 | aa             | AK    |
----------Data abbreviated due to space consumption-----------------------------------

如您所见,在最后一行中,第一部分为null,因为这个区域"aa“没有任何变电站。

问题

如果存在没有变电站的区域,我希望hibernate返回一个substation对象,其中所有其他数据集都为空,并且只返回区域数据集。

但我得到的是,每当hibernate找到像第三行这样的数据时,它都会返回空对象。

所以我的问题是,当我在查询中指定fetch时,为什么hibernate不执行立即加载。在执行紧急加载之后,它应该初始化一个新的变电站对象,并在其中设置区域。

在任何情况下,它都不应该返回空值。

示例

为了证明这一点,这是我打印结果时得到的结果

代码语言:javascript
运行
复制
com.tollgrade.smartgrid.model.Substation@10cc6578
com.tollgrade.smartgrid.model.Substation@ed192112
null

注意到第三个是null,因为它的数据类似于我在数据库输出中提到的第三行。它不应为空。它必须包含一个substaion对象,该对象具有除region字段以外的所有其他字段为空。

调试

这是HQL调试输出:

代码语言:javascript
运行
复制
014-05-15 15:50:31.122 DEBUG [org.hibernate.SQL] - select substation0_.id as id91_0_, region1_.id as id85_1_, substation0_.region_id as region2_91_0_, substation0_.name as name91_0_, substation0_.lon as lon91_0_, substation0_.lat as lat91_0_, region1_.name as name85_1_, region1_.state as state85_1_ from smartgrid.substation substation0_ right outer join smartgrid.region region1_ on substation0_.region_id=region1_.id
2014-05-15 15:50:31.123 TRACE [descriptor.sql.BasicExtractor] - found [1] as column [id91_0_]
2014-05-15 15:50:31.123 TRACE [descriptor.sql.BasicExtractor] - found [1] as column [id85_1_]
2014-05-15 15:50:31.123 TRACE [descriptor.sql.BasicExtractor] - found [8] as column [id91_0_]
2014-05-15 15:50:31.124 TRACE [descriptor.sql.BasicExtractor] - found [1] as column [id85_1_]
2014-05-15 15:50:31.124 TRACE [descriptor.sql.BasicExtractor] - found [null] as column [id91_0_]
2014-05-15 15:50:31.124 TRACE [descriptor.sql.BasicExtractor] - found [4] as column [id85_1_]
2014-05-15 15:50:31.124 TRACE [descriptor.sql.BasicExtractor] - found [2] as column [id91_0_]
2014-05-15 15:50:31.124 TRACE [descriptor.sql.BasicExtractor] - found [7] as column [id85_1_]
2014-05-15 15:50:31.124 TRACE [descriptor.sql.BasicExtractor] - found [7] as column [id91_0_]
2014-05-15 15:50:31.124 TRACE [descriptor.sql.BasicExtractor] - found [7] as column [id85_1_]
2014-05-15 15:50:31.124 TRACE [descriptor.sql.BasicExtractor] - found [9] as column [id91_0_]
2014-05-15 15:50:31.124 TRACE [descriptor.sql.BasicExtractor] - found [7] as column [id85_1_]
2014-05-15 15:50:31.124 TRACE [descriptor.sql.BasicExtractor] - found [null] as column [id91_0_]
------------------------------------Abbreviated Output------------------------------------------
EN

回答 1

Stack Overflow用户

发布于 2015-03-02 11:46:41

hibernate返回null的原因是因为在hibernate查询中:

代码语言:javascript
运行
复制
from Substation sub right outer join fetch sub.region

我们返回一个子站对象,当hibernate找不到一个子站时( region没有任何子站的情况),它没有任何可以设置适当区域值的对象。

此外,在"from“之前不给出任何东西会使hibernate自动修改查询,因此本质上是这样的:

代码语言:javascript
运行
复制
select sub from Substation sub right outer join fetch sub.region

从这里可以清楚地看出,我们专门使用hibernate来返回我的substation对象。区域是否被紧急加载都无关紧要。当没有变电站可连接时,hibernate不会获取region region对象。

我不确定我对hibernate的期望是什么--自动创建一个变电站对象,并将其除region值之外的所有值设置为null。嘿!!看看这家伙。太傻了。

无论如何,正确的查询应该是这样的:

代码语言:javascript
运行
复制
select sub, reg from Substation sub inner join fetch Region reg sub.region = reg.id

该查询将返回两个对象--变电站和地区。如果substation为null,则第一个对象将为null,但您仍将拥有所需的第二个对象集。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23686255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档