hibernate - hql 在右外连接上获取

[场景]

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

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

我在 Hibernate 查询语言上做这样的右外连接:

from Substation sub right outer join fetch sub.region

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

[数据库]

这是我的区域表的样子:

mysql> select * from region;
+----+----------------+-------+
| id | name           | state |
+----+----------------+-------+
|  1 | Entire Network |       |
|  4 | aa             | AK    |
-------Data abbreviated due to space consumption-------

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

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--------

右外连接后,这是我得到的:

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-----------------------------------

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

[问题]

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

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

所以我的问题是,当我在查询中指定 fetch 时,为什么 hibernate 不进行预先加载。在进行预先加载后,它应该初始化一个新的 Substation 对象并在其中设置区域。

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

[例子]

只是为了演示,这是我打印结果时得到的结果

com.tollgrade.smartgrid.model.Substation@10cc6578
com.tollgrade.smartgrid.model.Substation@ed192112
null

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

[调试]

这是 HQL 调试输出:

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------------------------------------------

最佳答案

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

from Substation sub right outer join fetch sub.region

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

此外,在“from”之前不提供任何内容会使 hibernate 自动修改查询,因此它基本上变成了这样:

select sub from Substation sub right outer join fetch sub.region

从这里可以看得很清楚,我们特意说hibernate把substation对象还给我。该区域是否被急切加载并不重要。当没有要连接的变电站时,hibernate 不会获取区域区域对象。

我不确定我对 hibernate 的期望是什么——自动创建一个变电站对象并将其所有值设置为 null,区域值除外。噗!!看看这个人。笨蛋。

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

select sub, reg from Substation sub inner join fetch Region reg sub.region = reg.id

此查询将返回两个对象 - Substation 和 Region。如果 substation 为 null,则第一个对象将为 null,但您仍将拥有所需的第二个对象集。

https://stackoverflow.com/questions/23686255/

相关文章:

python - 在你的包的 setup.py 中使用 setuptools——你如何有条件地安装脚

ruby-on-rails - 在 Rails Controller 中跳过多个过滤器

SAPUI5 - Sap.m.RadioButton 值字段?

javascript - 为什么在 Chrome Dev-tools 中的 Resources ->

sql-server-2008-r2 - SQL Server 2008 R2 Express :

java - 如何为复选框添加边框并使其始终可见

gcc - 在 GCC 的函数中禁用特定循环的自动矢量化

c# - displayformatattribute 自定义格式化字符串

string - 如何在 Matlab 中为文本添加轮廓?

validation - 如何验证从应用程序到我的 Web 服务的请求的真实性