2009-12-22 88 views
2

我有我在NHibernate的使用表的每類映射到的繼承層次結構判據。我的映射文件看起來像下面的文件(大量屬性省略)。繼承:上實體類型和子類的屬性

查詢這個層次,我基於從用戶輸入過濾器建立一個動態的DetachedCriteria消息。消息(層次結構中的任何類型)應該在一個列表中返回給用戶。

  1. 我想建立一個基於消息類型的標準,即。用戶可以指定獲取類型爲的所有消息SMSMessageEmailMessageReceivedDate>'2009-01-01'。我會怎麼做呢?
  2. 在相同的查詢中,用戶可以指定如果消息是InternalMessage,它應該有優先級 = 2.我該如何指定這種類型特定的謂詞?

所有這些都可以在LINQ中完成,所以我希望我也可以在NHibernate中做到這一點。

<class name="Message" table="Message" abstract="true" discriminator-value="null"> 
    <id name="MessageId"> 
    <generator class="identity" /> 
    </id> 
    <discriminator column="Type" type="byte" /> 
    <property name="ParentId" /> 
    <property name="ReceivedDate" /> 
    ... 
    <subclass name="SMSMessage" discriminator-value="0"> 
    <property name="Text" column="Text" /> 
    ... 
    </subclass> 
    <subclass name="MMSMessage" discriminator-value="1"> 
    <property name="Subject" /> 
    ... 
    </subclass> 
    <subclass name="EmailMessage" discriminator-value="2"> 
    <property name="BodyPlainText" /> 
    ... 
    </subclass> 
    <subclass name="InternalMessage" discriminator-value="4"> 
    <property name="Priority" /> 
    ... 
    </subclass> 
</class> 

回答

2

我有點想通了這一點我自己,但最終我最終恢復到純SQL,因爲我擊中HQL /規定 - 太多的障礙。無論如何,我可以分享我是如何做到這一點的。

  1. 也許不是很漂亮,但我加鑑別列作爲一個普通的屬性到頂層類層次結構中的(消息)和使用的限制,針對該列解決它。

  2. 事實證明,你可以指定爲對抗甚至在頂級查詢子類性質的限制,所以這是比我想象的更容易。這只是一個明確限制的問題。