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

mpo*_*llo 5 nhibernate hibernate hql

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

from Foo where SOME_FOREIGN_KEY = 42
Run Code Online (Sandbox Code Playgroud)

第二个看起来像这样:

from Foo as foo
 inner join foo.Bar as bar
 where foo.SOME_FOREIGN_KEY = 42
Run Code Online (Sandbox Code Playgroud)

SOME_FOREIGN_KEY列不是Hibernate知道的映射名称.

出于某种原因,第一个HQL查询起作用,但第二个不起作用.

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

Pas*_*ent 11

出于某种原因,第一个HQL查询起作用,但第二个不起作用.

当您在WHEREHQL查询的子句中使用Hibernate不知道的内容时(例如,未在SQL方言中注册的函数),Hibernate会巧妙地将其直接传递给数据库.

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

from Foo where SOME_FOREIGN_KEY = 42
Run Code Online (Sandbox Code Playgroud)

被翻译成以下SQL

SELECT FROM TABLE_FOO WHERE SOME_FOREIGN_KEY = 42
Run Code Online (Sandbox Code Playgroud)

如果TABLE_FOO实际上有一SOME_FOREIGN_KEY列,则可以工作.

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

from Foo as foo where foo.SOME_FOREIGN_KEY = 42
Run Code Online (Sandbox Code Playgroud)

Hibernate试图解决SOME_FOREIGN_KEY一个属性的的Foo实体,这显然会失败.

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

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

from Foo as foo
 inner join foo.Bar as bar
 where SOME_FOREIGN_KEY = 42
Run Code Online (Sandbox Code Playgroud)

但老实说,我不明白为什么你不想使用路径表达式,我建议不要使用上面的解决方案.HQL的一个重点是抽象表名和列名,你将在这里完全击败这个目标.