如何在纯SQL查询中为连接表定义表别名?

时间:2011-07-18 12:40:33

标签: nhibernate native-sql

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

1 个答案:

答案 0 :(得分:0)

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