2012-01-18 49 views
0

に基づいて、交差点テーブルのエントリを取得します。私は3つのテーブルを持っているキー

offer_group_membersには、オファーが属するグループ(オファープライマリキー、オファーグループプライマリキー)が格納されています。 OfferGroupsは、オファーキーに基づいてOFFER_GROUP_MEMBERSテーブルからすべてを取得するにはどうすればよいですか?私はこのような何かしようとした

:ここ

Criteria crit; 
crit = getSession().createCriteria(Offer.class); 
crit = crit.createCriteria("offerGroups"); 
crit.add(eq("key", offerKey)); 

は、マッピングは、次のとおりです提供のための

:offer_group_keyため

<composite-id name="comp_id" 
     class="com.infonova.psm.hibernate.prodsrv.OfferPK"> 
     <key-property name="key" column="KEY" 
      type="java.lang.String" length="128"> 
     </key-property> 
    </composite-id> 

<id name="key" type="java.lang.String" column="KEY" length="128"> 
     <generator class="assigned"/> 
    </id>` 
offer_group_keyため

:プランのため

 <set name="offers" table="OFFER_GROUP_MEMBERS" lazy="true" inverse="false" 
     cascade="none"> 
     <key> 
      <column name="OFFER_GROUP_KEY"/> 
     </key> 
     <many-to-many class="Offer"> 
      <column name="OFFER_KEY"/> 
     </many-to-many> 
    </set> 

 <set name="offerGroups" table="OFFER_GROUP_MEMBERS" 
     inverse="true" lazy="true" cascade="none"> 
     <key> 
      <column name="OFFER_KEY" /> 
     </key> 
     <many-to-many 
      class="OfferGroup"> 
      <column name="OFFER_GROUP_KEY" /> 
     </many-to-many> 
    </set> 

答えて

0

それはHQLや基準が仕事を照会することをその上にあるので、あなたは、私たちにエンティティを示した場合、それは容易になるだろう。とにかく

は、HQLで:

select og from Offer o 
inner join o.offerGroups og 
where o.key = :key 

や基準では、残念ながら、IIRCは、あなたがすることができるすべては、ルートエンティティまたはスカラを選択しているので、bidirectionallの関連付けをせずにこれを行うのは難しいです。あなたが双方向関連を持っていないので、あなたが双方向関連を持っていた場合、あなたは

Criteria c = session.createCriteria(OfferGroup.class, "og"); 
c.createAlias("og.offers", "o"); 
c.add(Restrictions.eq("o.key", key)); 

を行うことができ、私の知っている唯一の方法は、これを行うことです。

これに該当する
Criteria c = session.createCriteria(OfferGroup.class, "og"); 
DetachedCriteria dc = DetachedCriteria.forClass(Offer.class, "o"); 
dc.createAlias("o.offerGroups", "og2"); 
dc.add(Restrictions.eq("o.key", key)); 
dc.setProjection(Projections.property("og2.id")); 
c.add(Subqueries.propertyIn("og.id", dc)); 

醜いHQLクエリ:

select og from OggerGroup og 
where og.id in (select og2.id from Offer o 
       inner join o.offerGroups og2 
       where o.key = :key) 

、このような単純な静的クエリの場合は、私はむしろHQLより基準で行くにはどのような理由が表示されません。

関連する問題