由于某种原因,第一个 HQL 查询有效,但第二个 HQL 查询无效。
当你在 Hibernate 中使用了一些不认识的东西时WHERE
HQL 查询的子句(例如,未在 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 的要点之一是抽象表和列名称,在这里您将完全无法实现这一目标。