我有一个用这样的<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_ 等等。