3

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

4

1 回答 1

0

似乎这是不可能的,所以我现在为它创建了一个功能请求:NH-2822

于 2011-08-03T05:37:40.833 回答