1

関連オブジェクトのリストを含むクラスがあります。

次のようにマッピングしました。

<class name="MyDto" table="`MyView`" mutable="false"  lazy="false">
    <id name="Id" column="ID" type="int">
        <generator class="assigned" />
    </id>

    <set name="Days" cascade="all-delete-orphan" lazy="false" >
          <key column="Id" />
          <one-to-many class="MyAssociatedObj"/>
    </set>
</class>

<class name="MyAssociatedObj" table="V_SC_NEED" mutable="false" lazy="false" >
    <id name="Id"  column="`ID2`" type="int">
        <generator class="assigned" />
    </id>

    <property type="DateTime" not-null="true" name="DayDate"  column="`Date`" />

    <component name="Audit">
        <property type="string" not-null="true" length="255" name="Username" column="`USERNAME`" />
        <property type="decimal" not-null="true" name="PreviousValue" column="`PrevVal`" />
    </component>
</class>

私がやりたかったことは、関連付けられたオブジェクト MyAssociatedObject でフィルタリングして、MyDto オブジェクトのリストを取得することです。

つまり、たとえば、次の場合:

UnitOfWork.Session.CreateCriteria<MyDto>().List<MyDto>()

42行のリストを取得します。ここで、関連付けられたオブジェクトでそれらをフィルタリングしたいと思います。問題は、私がそうするときです:

UnitOfWork.Session.CreateCriteria<MyDto>().CreateAlias("Days", "days").Add(Restrictions.Between("days.DayDate", query.FromDate, query.ToDate));

私は何とか684行を取得しています! (いくつかのデカルト積または何か)。

何かアドバイスはありますか?どうもありがとう !

4

1 に答える 1

2

クラスと多対1の関係にあるように見える、とJOINしているため、2番目のクエリでより多くの行を取得しています。 の重複を除外する場合は、DistinctRootResultTransformerを使用できます。 MyAssociatedObjMyDTO
MyDTO

UnitOfWork.Session.CreateCriteria<MyDto>().CreateAlias("Days", "days")  
   .Add(Restrictions.Between("days.DayDate", query.FromDate, query.ToDate))  
   .SetResultTransformer(  
          new NHibernate.Transform.DistinctRootEntityResultTransformer());  

それが役に立てば幸い。

于 2012-12-11T11:49:16.980 に答える