我有三张桌子:
offers; offer_groups; offer_group_members.
offers
和offer_groups
表与hibernate映射(见下文)。
在offer_group_members
中,我存储商品所属的组(提供主键,商品组主键)。
我对hibernate不熟悉所以我的问题是:如何根据Offer键从OfferGroups
表中获取所有OFFER_GROUP_MEMBERS
?
我试过这样的事情:
Criteria crit;
crit = getSession().createCriteria(Offer.class);
crit = crit.createCriteria("offerGroups");
crit.add(eq("key", offerKey));
以下是映射:
要约:
<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>
for offer_group_key:
<id name="key" type="java.lang.String" column="KEY" length="128">
<generator class="assigned"/>
</id>`
for 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 :(得分:0)
如果你向我们展示实体会更容易,因为HQL和标准查询在它们上面工作。
无论如何,在HQL中:
select og from Offer o
inner join o.offerGroups og
where o.key = :key
而在Criteria中,不幸的是,IIRC,您所能做的就是选择根实体或标量,因此如果没有双向关联,很难做到这一点。如果您有双向关联,则可以执行
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)
对于这样简单的静态查询,我认为没有理由选择Criteria而不是HQL。