为什么在 HQL 中直接使用列名有时只能起作用?

2024-06-19

我有两个 HQL 查询用于快速而肮脏的单元测试。第一个看起来有点像这样:

from Foo where SOME_FOREIGN_KEY = 42

第二个看起来像这样:

from Foo as foo
 inner join foo.Bar as bar
 where foo.SOME_FOREIGN_KEY = 42

SOME_FOREIGN_KEY 列不是 Hibernate 知道的已映射内容的名称。

由于某种原因,第一个 HQL 查询有效,但第二个 HQL 查询无效。

我的目标是让第二个版本正常工作,而无需遍历对象图到由外键标识的对象。对于此测试,我有一个已知的 ID,并且我只需要与该 ID 相关的对象。关系另一端的对象本身是无关紧要的。这可能吗?


由于某种原因,第一个 HQL 查询有效,但第二个 HQL 查询无效。

当你在 Hibernate 中使用了一些不认识的东西时WHEREHQL 查询的子句(例如,未在 SQL 方言中注册的函数),Hibernate 会智能地执行直接将其传递到数据库.

换句话说,假设Foo被映射到TABLE_FOO,以下 HQL

from Foo where SOME_FOREIGN_KEY = 42

被翻译成下面的SQL

SELECT FROM TABLE_FOO WHERE SOME_FOREIGN_KEY = 42

如果TABLE_FOO实际上有一个SOME_FOREIGN_KEY column.

但是,当使用第二个示例中的别名时:

from Foo as foo where foo.SOME_FOREIGN_KEY = 42

Hibernate尝试解决SOME_FOREIGN_KEY as 财产 of the Foo实体,这显然失败了。

我的目标是让第二个版本正常工作,而无需遍历对象图到由外键标识的对象。

如果您为列添加别名前缀,则不会。所以以下应该有效:

from Foo as foo
 inner join foo.Bar as bar
 where SOME_FOREIGN_KEY = 42

但老实说,我不明白为什么你不想使用路径表达式,我建议不要使用上述解决方案。 HQL 的要点之一是抽象表和列名称,在这里您将完全无法实现这一目标。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 HQL 中直接使用列名有时只能起作用? 的相关文章

随机推荐