我有一個映射與<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