我有一个映射与<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_等等。
你真的需要sqlquery的?你可以在where和select子句中注入sql,而不会丢失大部分的自动连接部分 – Firo
是的,我需要普通的SQL,因为我在做一些NHibernate不支持的事情(特殊的Oracle语法如“WITH ... SELECT” ,联盟和从关联表加入而不加入主表)。 – cremor