Почему-то первый 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
.
Однако при использовании псевдонима, как во втором примере:
from Foo as foo where foo.SOME_FOREIGN_KEY = 42
Hibernate пытается разрешить SOME_FOREIGN_KEY
как свойство объекта Foo
, и это явно не удается.
Моя цель здесь - заставить работать вторую версию, не пересекая граф объекта до объекта, идентифицируемого внешним ключом.
Не будет, если вы префикс столбца с псевдонимом. Поэтому должно работать следующее:
from Foo as foo
inner join foo.Bar as bar
where SOME_FOREIGN_KEY = 42
Но, честно говоря, я не понимаю, почему вы не хотите использовать выражение пути, и я бы советовал не использовать вышеупомянутое решение. Одна из целей HQL - абстрагировать имена таблиц и столбцов, и вы бы полностью победили эту цель.