2009-01-07 12 views
12

Betrachten Sie die folgende Hibernate Mapping-Datei:Anwendung des Hibernate-Filter-Attribut auf eine Tasche mit einem many-to-many-Beziehung

<hibernate-mapping ...> 
<class name="ContentPackage" table="contentPackages"> 
    <id name="Id" column="id" type="int"><generator class="native" /></id> 
    ... 
    <bag name="Clips" table="contentAudVidLinks"> 
     <key column="fk_contentPackageId"></key> 
     <many-to-many class="Clip" column="fk_AudVidId"></many-to-many> 
     <filter name="effectiveDate" condition=":asOfDate BETWEEN startDate and endDate" /> 
    </bag> 
</class> 
</hibernate-mapping> 

Wenn ich den folgenden Befehl:

_session.EnableFilter("effectiveDate").SetParameter("asOfDate", DateTime.Today); 

    IList<ContentPackage> items = _session.CreateCriteria(typeof(ContentPackage)) 
            .Add(Restrictions.Eq("Id", id)) 
            .List<ContentPackage>(); 

Die resultierende SQL hat die WHERE-Klausel in der Zwischenmapping-Tabelle (contentAudVidLinks) und nicht in der "Clips" -Tabelle, obwohl ich das Filterattribut dem Bag of Clips hinzugefügt habe.

Was mache ich falsch?

Antwort

16

Ich habe es herausgefunden. Für alle Interessierten, hatte ich meine <filter> Attribut an der falschen Stelle:

Vorher:

<bag name="Clips" table="ctv_bb_contentAudVidLinks"> 
    <key column="fk_contentPackageId"></key> 
    <many-to-many class="Clip" column="fk_AudVidId"></many-to-many> 
    <filter name="effectiveDate" condition=":asOfDate BETWEEN startDate and endDate" /> 
</bag> 

Nach:

<bag name="Clips" table="ctv_bb_contentAudVidLinks"> 
    <key column="fk_contentPackageId"></key> 
    <many-to-many class="Clip" column="fk_AudVidId"> 
    <filter name="effectiveDate" condition=":asOfDate BETWEEN startDate and endDate" /> 
    </many-to-many> 
</bag>