2010-12-17 4 views
7

В системе EAV, у меня есть отображение, которое выглядит следующим образом:NHibernate HQL: левое внешнее соединение с «с» пункт не работает

<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 

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

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

К сожалению, это производит следующее сообщение об ошибке: с-п выражения не ссылаться из-п элемент, к которому с-п ассоциировалось. Так что я попытался вместо этого:

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

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

Любые идеи о том, как получить эту работу? Благодарю.

- Брайан

ответ

9

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

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

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

+0

Можно ли это сделать с Критериями? – 2013-08-08 19:24:35

Смежные вопросы