У меня есть объект, который отображается с элементом <join>
, подобным этому:
<class name="Entity" table="Entites">
<id name="Id">
<generator class="guid" />
</id>
<property name="SomeProperty" />
<join table="EntityData" optional="true">
<key column="entity_id" />
<property name="SomeDataProperty />
</join>
</class>
и собственный запрос SQL, который должен запрашивать эту сущность следующим образом (фактический запрос, конечно, более сложен и использует функции Oracle, недоступные в других типах запросов NHibernate):
var query = session.CreateSQLQuery(
"select {entity.*} from Entities {entity}" +
"left outer join EntityData data on {entity}.Id = data.entity_id"
);
query.AddEntity("entity", typeof(Entity));
Но это не работает, потому что NHibernate вводит свойства соединения с неправильным псевдонимом ("entity_1 _").
Я также пытался указать псевдоним таблицы как "{data}", но тогда NHibernate не заменяет его (все еще содержит фигурные скобки в простом SQL).
Добавление результата соединения к запросу (query.AddJoin("data", "entity.EntityData")
) тоже не работает. Я отлаживал это, и NHibernate игнорирует его, потому что в какой-то момент он проверяет, является ли свойство коллекцией или сущностью (но это компонент, поэтому ни одно из условий if не выполняется).
Обходной путь - указать псевдоним соединения, как NHibernate генерирует его (в моем случае "entity_1_"), тогда все работает.
Кто-нибудь знает, как это можно решить правильно?
edit: У меня сейчас та же проблема при запросе сущности, которая сопоставлена с отображением наследования. Я могу определить псевдоним для базовой сущности, но унаследованные сущности называются entity_1_, entity_2_ и т. Д.