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