0

enter code hereアイテムのリストに制限を適用したいので、特定の日付のアイテムのみが取得されます。

これが私のマッピングです:

    <class name="MyClass" 
            table="MyTable" mutable="false" >
            <cache usage="read-only"/>
    <id name="myId" column="myId" type="integer"/>
    <property name="myProp" type="string" column="prop"/>
    <list name="items" inverse="true" cascade="none">
        <key column="myId"/>
        <list-index column="itemVersion"/>
        <one-to-many class="Item"/>
    </list> 
   </class>
    <class name="Item" 
            table="Items" mutable="false" >
            <cache usage="read-only"/>
    <id name="myId" column="myId" type="integer"/>
    <property name="itemVersion" type="string" column="version"/>
    <property name="startDate" type="date" column="startDate"/>
   </class>

私はこのコードを試しました:

Criteria crit = session.createCriteria(MyClass.class);
crit.add( Restrictions.eq("myId", new Integer(1)));
crit = crit.createCriteria("items").add( Restrictions.le("startDate", new Date()) );

その結果、次の要求が発生します。

select ...
from MyTable this_ inner join Items items1_ on this_.myId=items1_.myId 
where this_.myId=? and items1_.startDate<=?

に続く

select ...
from Items items0_ 
where items0_.myId=?

しかし、私が必要としているのは次のようなものです。

select ...
from MyTable this_ 
where this_.myId=?

に続く

select ...
from Items items0_ 
where items0_.myId=? and items0_.startDate<=?

アイテムのリストに基準を適用する方法はありますか?

4

2 に答える 2

0

ここには 2 つのオプションがあります: A) 次のコレクションに対して
フィルタを定義できます:"items"MyClass

<filter name="starDateFilter" condition="startDate <= :startDate"/>

次に、呼び出して適用します

session.enableFilter("startDateFilter").setParameter("startDate", new Date());

オブジェクトを取得する前に。MyClassこのシナリオでは、 ではなく に基づいて Criteria のみを指定します(Criteria がまったく必要な場合はItem、必要なものが だけである場合にのみ使用できます)。 session.load()id

B)itemsコレクションを遅延フェッチに設定します。オブジェクトを照会 (または ID で取得)し、単独で (にリンクせずに) MyClassに基づいて基準を作成します。ItemMyClass

Criteria crit = session.createCriteria(Item.class);
crit.add( Restrictions.le("startDate", new Date()) );

これはリストを返しItemsます(マッピングから判断すると、とにかく戻るリンクがありませMyClassん)。オプション (B) は、探している SQL クエリを生成します。

于 2009-07-13T17:37:05.397 に答える
0
Criteria crit = session.createCriteria(MyClass.class);
crit.add( Restrictions.eq("myId", new Integer(1)));
crit.setFetchMode( "items", FetchMode#JOIN );
crit = crit.createCriteria("items").add( Restrictions.le("startDate", new Date()) );

そのコレクションの「ライブ」フィルター ビューを作成していることに注意してください。そのコレクションの一部である必要がある他のすべてのアイテムが削除され始めた場合は、どこを見ればよいか正確にわかります。

より良い方法は、必要なアイテムのリストを直接クエリすることです。

String hql = "select i from MyClass m inner join m.items i where i.startDate <= :theDate";
List items = session.createQuery( hql )
        .setParameter( "theDate", theDate )
        .list();

プロジェクションを使用して基準で同じことを行うことができます。

于 2012-05-23T12:40:06.673 に答える