Получить записи в таблице пересечений на основе ключа - PullRequest
0 голосов
/ 18 января 2012

У меня есть три таблицы:

offers; offer_groups; offer_group_members.

Таблицы offers и offer_groups отображаются в режиме гибернации (см. Ниже).

В offer_group_members я сохраняю, к какой группе принадлежат предложения (первичный ключ предложения, первичный ключ группы предложений).

Я новичок в спящем режиме, поэтому мой вопрос: Как я могу получить все 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>  

для offer_group_key:

    <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>

1 Ответ

0 голосов
/ 18 января 2012

Было бы проще, если бы вы показали нам сущности, поскольку именно на них работают 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)

Для таких простых статических запросов я не вижу причин использовать критерий, а не HQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...