2009-07-13 15 views
0

enter code hereアイテムのリストに制限を適用したいので、指定した日付のアイテムのみが検索されます。ここで条件付き1対多

は私のマッピングです:

<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 Items items0_ 
where items0_.myId=? 
続い
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=? and items0_.startDate<=? 

私はアイテムのリスト上の基準を適用することができますどのように任意のアイデアが続く

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

しかし、私は必要のようなものでしょうか?

答えて

0

あなたはここに2つのオプションがあります。あなたはMyClass"items"コレクションにフィルタを定義することができ
Aを):

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

あなたはその後、前にあなたを取得する

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

を呼び出すことによって、それを適用しますオブジェクト。このシナリオでは、MyClassに基づく基準のみを指定し、Itemには指定しません(基準がすべて必要な場合は、を使用してください)。idです。

B)itemsコレクションをレイジーフェッチに設定します。クエリ(またはIDで検索)あなたのMyClassオブジェクトは、その後、(MyClassへのリンクなし)のみItemに基づいた基準を作成します。

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

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

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(); 

あなたは投影を使用して基準と同じことを行うことができます。