Почему использование имени столбца непосредственно в HQL иногда работает? - PullRequest
4 голосов
/ 12 октября 2010

У меня есть два запроса 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-запрос работает, а второй - нет.

Моя цель здесь - заставить работать вторую версию, не пересекая граф объекта до объекта, идентифицированного внешним ключом.,Для этого теста у меня есть известный идентификатор, и я хочу только объекты, связанные с этим идентификатором.Сам объект на другом конце отношений не имеет значения.Это возможно?

Ответы [ 2 ]

9 голосов
/ 12 октября 2010

Почему-то первый 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 - абстрагировать имена таблиц и столбцов, и вы бы полностью победили эту цель.

1 голос
/ 12 октября 2010

Итак, Foo в первом примере без псевдонима, а во втором - это так.Это означает, что во втором примере Hibernate ищет свойство 'foo'.Это должно быть ответом.

Может быть, это будет работать:

      select  f
      from    Foo f
      inner join f.Bar bar
      where   f.SomeForeignKeyId = 42

SomeForeignKeyId - это свойство, сопоставленное с SOME_FOREIGN_KEY, в любом случае вам придется делать это через поле Id ссылающейся сущности.

Также выборкаFoo, как в первом примере, должно работать нормально, в зависимости от вашего отображения.Так что, если в вашем отображении есть Eager fetching, это должно работать, насколько я знаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...