我有一个用<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查询应该像这样查询这个实体(实际的查询当然更复杂,并使用其他类型的NHibernate查询中没有的Oracle功能):
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条件都不是真的)。
解决方法是指定连接别名exaclty,如NHibernate生成它(在我的情况下为“entity_1_”),然后一切正常。
有谁知道如何才能正确解决这个问题?
编辑:查询使用继承映射映射的实体时,我现在遇到了同样的问题。我可以为基本实体定义别名,但是继承的实体名为entity_1_,entity_2_等等。