2011-07-18 31 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