NHibernate HQL: левое внешнее соединение с предложением "with" не работает - PullRequest
7 голосов
/ 17 декабря 2010

В системе EAV у меня есть отображение, которое выглядит так:

<class name="Record">
   <map name="Values" table="RecordFieldValue">
      <key column="RecordFK">
      <index column="FieldFK">
      <element column="Value">
   </map>
</class>

Я хотел бы выбрать несколько записей, упорядоченных по значению каждой записи для определенного поля. Однако обратите внимание, что не все записи на самом деле имеют значение для этого поля. В этом случае запись все равно должна быть извлечена и отсортирована с нулевым значением.

Нужный SQL будет выглядеть так:

select rec.*, val.Value
from Record rec
left outer join RecordFieldValue val
on val.RecordFK = rec.PK and val.FieldFK = :field
order by val.Value

После долгих поисков я обнаружил, что правильный способ изменить предложение on on левого соединения в HQL - это ключевое слово with (см. https://nhibernate.jira.com/browse/NH-514).. Поэтому я попробовал этот HQL:

from Record rec
left join rec.Values vals with index(vals) = :field
order by vals

К сожалению, это приводит к следующей ошибке: выражения with-clause не ссылаются на элемент from-clause, с которым ассоциировано with-clause . Поэтому я попробовал это вместо:

from Record rec
left join rec.Values vals with index(rec.Values) = :field
order by vals

Но это породило новую ошибку: с предложением может ссылаться только на столбцы в управляющей таблице .

Есть идеи, как получить эту работу? Спасибо.

- Брайан

1 Ответ

9 голосов
/ 18 декабря 2010

Это работает:

from Record rec
left join rec.Values vals with vals.index = :field
order by vals

Не совсем интуитивно или хорошо документировано, но оно выполняет свою работу.

...