2011-07-18 18 views
2

我有一个映射与<join>元素像这样的实体:如何在纯SQL查询中定义连接表的表别名?

<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生成它的连接别名exaclty(在我的情况下“entity_1_”),然后一切正常。

有没有人知道如何正确解决这个问题?

编辑:我现在在查询映射到继承映射的实体时遇到同样的问题。我可以为基础实体定义一个别名,但继承的实体名为entity_1_,entity_2_等等。

+0

你真的需要sqlquery的?你可以在where和select子句中注入sql,而不会丢失大部分的自动连接部分 – Firo

+0

是的,我需要普通的SQL,因为我在做一些NHibernate不支持的事情(特殊的Oracle语法如“WITH ... SELECT” ,联盟和从关联表加入而不加入主表)。 – cremor

回答

0

看起来这是不可能的,所以我现在已经创建了它的功能要求:NH-2822